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

eht16 at users.sourceforge.net eht16 at xxxxx
Wed Mar 17 23:27:44 UTC 2010


Revision: 1177
          http://geany-plugins.svn.sourceforge.net/geany-plugins/?rev=1177&view=rev
Author:   eht16
Date:     2010-03-17 23:27:44 +0000 (Wed, 17 Mar 2010)

Log Message:
-----------
Add treebrowser plugin to the geany-plugins, for now only for testing

Modified Paths:
--------------
    trunk/geany-plugins/Makefile.am
    trunk/geany-plugins/configure.ac
    trunk/geany-plugins/wscript

Added Paths:
-----------
    trunk/geany-plugins/build/treebrowser.m4
    trunk/geany-plugins/treebrowser/
    trunk/geany-plugins/treebrowser/AUTHORS
    trunk/geany-plugins/treebrowser/COPYING
    trunk/geany-plugins/treebrowser/ChangeLog
    trunk/geany-plugins/treebrowser/Makefile.am
    trunk/geany-plugins/treebrowser/NEWS
    trunk/geany-plugins/treebrowser/README
    trunk/geany-plugins/treebrowser/src/
    trunk/geany-plugins/treebrowser/src/Makefile.am
    trunk/geany-plugins/treebrowser/src/treebrowser.c

Modified: trunk/geany-plugins/Makefile.am
===================================================================
--- trunk/geany-plugins/Makefile.am	2010-03-17 17:23:39 UTC (rev 1176)
+++ trunk/geany-plugins/Makefile.am	2010-03-17 23:27:44 UTC (rev 1177)
@@ -12,7 +12,8 @@
 	geanyvc \
 	pretty-printer \
 	shiftcolumn \
-	spellcheck
+	spellcheck \
+	treebrowser
 
 ACLOCAL_AMFLAGS = -I build/cache -I build --install
 

Added: trunk/geany-plugins/build/treebrowser.m4
===================================================================
--- trunk/geany-plugins/build/treebrowser.m4	                        (rev 0)
+++ trunk/geany-plugins/build/treebrowser.m4	2010-03-17 23:27:44 UTC (rev 1177)
@@ -0,0 +1,8 @@
+AC_DEFUN([GP_CHECK_TREEBROWSER],
+[
+    GP_STATUS_PLUGIN_ADD([Treebrowser], [yes])
+    AC_CONFIG_FILES([
+        treebrowser/Makefile
+        treebrowser/src/Makefile
+    ])
+])

Modified: trunk/geany-plugins/configure.ac
===================================================================
--- trunk/geany-plugins/configure.ac	2010-03-17 17:23:39 UTC (rev 1176)
+++ trunk/geany-plugins/configure.ac	2010-03-17 23:27:44 UTC (rev 1177)
@@ -35,6 +35,7 @@
 GP_CHECK_PRETTYPRINTER
 GP_CHECK_SHIFTCOLUMN
 GP_CHECK_SPELLCHECK
+GP_CHECK_TREEBROWSER
 
 AC_CONFIG_FILES([
     Makefile

Added: trunk/geany-plugins/treebrowser/AUTHORS
===================================================================
Added: trunk/geany-plugins/treebrowser/COPYING
===================================================================
Added: trunk/geany-plugins/treebrowser/ChangeLog
===================================================================
Added: trunk/geany-plugins/treebrowser/Makefile.am
===================================================================
--- trunk/geany-plugins/treebrowser/Makefile.am	                        (rev 0)
+++ trunk/geany-plugins/treebrowser/Makefile.am	2010-03-17 23:27:44 UTC (rev 1177)
@@ -0,0 +1,4 @@
+include $(top_srcdir)/build/vars.auxfiles.mk
+
+SUBDIRS = src
+plugin = treebrowser

Added: trunk/geany-plugins/treebrowser/NEWS
===================================================================
Added: trunk/geany-plugins/treebrowser/README
===================================================================
Added: trunk/geany-plugins/treebrowser/src/Makefile.am
===================================================================
--- trunk/geany-plugins/treebrowser/src/Makefile.am	                        (rev 0)
+++ trunk/geany-plugins/treebrowser/src/Makefile.am	2010-03-17 23:27:44 UTC (rev 1177)
@@ -0,0 +1,5 @@
+include $(top_srcdir)/build/vars.build.mk
+
+geanyplugins_LTLIBRARIES = treebrowser.la
+treebrowser_la_SOURCES = treebrowser.c
+treebrowser_la_LIBADD = $(COMMONLIBS)

Added: trunk/geany-plugins/treebrowser/src/treebrowser.c
===================================================================
--- trunk/geany-plugins/treebrowser/src/treebrowser.c	                        (rev 0)
+++ trunk/geany-plugins/treebrowser/src/treebrowser.c	2010-03-17 23:27:44 UTC (rev 1177)
@@ -0,0 +1,850 @@
+//      treebrowser.c
+//
+//      Copyright 2010 Adrian Dimitrov <dimitrov.adrian at gmail.com>
+//
+//      This program is free software; you can redistribute it and/or modify
+//      it under the terms of the GNU General Public License as published by
+//      the Free Software Foundation; either version 2 of the License, or
+//      (at your option) any later version.
+//
+//      This program is distributed in the hope that it will be useful,
+//      but WITHOUT ANY WARRANTY; without even the implied warranty of
+//      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//      GNU General Public License for more details.
+//
+//      You should have received a copy of the GNU General Public License
+//      along with this program; if not, write to the Free Software
+//      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+//      MA 02110-1301, USA.
+
+/* Development release ChangeLog
+ * -----------------------------
+ *
+ * (16-03-2010)
+ * 		fix compilation warning messages
+ * 		fix some crytical errors
+ *
+ * (21-02-2010)
+ * 		fix patch applyed from Enrico about initial directories
+ *
+ * (20-02-2010)
+ * v0.1.1
+ * 		made strings suitable for localization
+ * 		fixed problem with default chroot
+ * 		added option to disable chrooting on double click on directory
+ *
+ * (17-02-2010)
+ * 	v0.1
+ *		added options to add/remove/rename directories and files
+ * 		code cleanup
+ *
+ * (14-02-2010)
+ * 	v0.0.1
+ * 		initial, with base options
+ *
+ */
+
+
+
+#include "geanyplugin.h"
+#include "Scintilla.h"
+
+/* These items are set by Geany before plugin_init() is called. */
+GeanyPlugin					*geany_plugin;
+GeanyData					*geany_data;
+GeanyFunctions				*geany_functions;
+
+static gint					page_number 				= 0;
+static GtkTreeStore 		*treestore;
+static GtkWidget			*treeview;
+static GtkWidget			*vbox;
+static GtkWidget			*vbox_bars;
+static GtkWidget			*addressbar;
+static gchar				*addressbar_last_address 	= NULL;
+static GtkWidget 			*filter;
+
+static GtkTreeViewColumn 	*treeview_column_icon, *treeview_column_text;
+static GtkCellRenderer 		*render_icon, *render_text;
+
+// config
+static gint					CONFIG_DIRECTORY_DEEP 		= 1;
+static gboolean				CONFIG_SHOW_HIDDEN_FILES 	= FALSE;
+static gboolean				CONFIG_SHOW_BARS			= TRUE;
+static gboolean				CONFIG_CHROOT_ON_DCLICK		= FALSE;
+
+// treeview struct
+enum
+{
+	TREEBROWSER_COLUMNC 								= 3,
+
+	TREEBROWSER_COLUMN_ICON								= 0,
+	TREEBROWSER_COLUMN_NAME								= 1,
+	TREEBROWSER_COLUMN_URI								= 2,
+
+	TREEBROWSER_RENDER_ICON								= 0,
+	TREEBROWSER_RENDER_TEXT								= 1
+};
+
+
+PLUGIN_VERSION_CHECK(147)
+PLUGIN_SET_INFO(_("Tree Browser"), _("Treeview filebrowser plugin."), "0.1" , " e01 (Enzo_01 at abv.bg)")
+
+
+// predefines
+#define foreach_slist_free(node, list) \
+	for (node = list, list = NULL; g_slist_free_1(list), node != NULL; list = node, node = node->next)
+
+// prototypes
+static void 		msgbox(gchar *message);
+static gboolean 	dialogs_yesno(gchar* message);
+static gboolean 	check_filtered(const gchar* base_name);
+static gchar* 		get_default_dir(void);
+static void 		on_renamed(GtkCellRenderer *renderer, const gchar *path_string, const gchar *newname, gpointer data);
+static GtkWidget* 	create_popup_menu(gpointer *user_data);
+static GtkWidget* 	create_view_and_model (void);
+static int 			gtk_tree_store_iter_clear_nodes(GtkTreeIter iter, gboolean delete_root);
+static void 		treebrowser_browse(gchar *directory, GtkTreeIter parent, gboolean isRoot, gint deep_limit);
+static void 		fs_remove(gchar *root, gboolean delete_root);
+static void 		treebrowser_track_path(gchar *directory);
+static void 		treebrowser_chroot(gchar *directory);
+static void 		showbars(gboolean state);
+static void 		on_menu_showhide_bars(GtkMenuItem *menuitem, gpointer *user_data);
+static void 		on_menu_external_open(GtkMenuItem *menuitem, gpointer *user_data);
+static void 		on_menu_go_parent(GtkMenuItem *menuitem, gpointer *user_data);
+static void			on_menu_set_as_root(GtkMenuItem *menuitem, gpointer *user_data);
+static void 		on_menu_refresh(GtkMenuItem *menuitem, gpointer *user_data);
+static void 		on_row_expanded(GtkWidget *widget, GtkTreeIter *iter, GtkTreePath *path, gpointer user_data);
+static void 		on_row_collapsed(GtkWidget *widget, GtkTreeIter *iter, GtkTreePath *path, gpointer user_data);
+static void 		on_addressbar_activate(GtkEntry *entry, gpointer user_data);
+static void 		on_addressbar_icon (GtkEntry *entry, GtkEntryIconPosition icon_pos, GdkEvent *event, gpointer user_data);
+static void 		on_filter_activate(GtkEntry *entry, gpointer user_data);
+static gboolean* 	treebrowser_track_path_cb(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer user_data);
+// end of prototypes
+
+
+static void
+msgbox(gchar *message)
+{
+	GtkWidget *window;
+	GtkWidget *dialog;
+
+	dialog = gtk_message_dialog_new(GTK_WINDOW (window),
+				GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+				GTK_MESSAGE_INFO,
+				GTK_BUTTONS_OK,
+				"%s",
+				message);
+
+	gtk_dialog_run(GTK_DIALOG (dialog));
+	gtk_widget_destroy(dialog);
+}
+
+
+static gboolean
+dialogs_yesno(gchar *message)
+{
+	GtkWidget *window, *dialog;
+	dialog = gtk_message_dialog_new(GTK_WINDOW(window),
+				GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+				GTK_MESSAGE_QUESTION,
+				GTK_BUTTONS_YES_NO,
+				"%s",
+				message);
+
+	if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_YES)
+	{
+		gtk_widget_destroy(dialog);
+		return TRUE;
+	}
+	gtk_widget_destroy(dialog);
+	return FALSE;
+}
+
+
+
+static gboolean// get from filebrowser.c (with little modifications)
+check_filtered(const gchar *base_name)
+{
+	if (gtk_entry_get_text_length(GTK_ENTRY(filter)) < 1)
+		return TRUE;
+
+	if (utils_str_equal(base_name, "*") || g_pattern_match_simple(gtk_entry_get_text(GTK_ENTRY(filter)), base_name))
+		return TRUE;
+
+	return FALSE;
+}
+
+static gchar*
+get_default_dir(void)
+{
+	gchar 			*dir;
+	GeanyProject 	*project 	= geany->app->project;
+	GeanyDocument	*doc 		= document_get_current();
+
+	if (doc != NULL && doc->file_name != NULL && ! g_path_is_absolute(doc->file_name))
+		return g_path_get_dirname(doc->file_name);
+	else
+		if (project)
+			return project->base_path;
+		else
+			if (geany->prefs)
+				return geany->prefs->default_open_path;
+			else
+				return g_get_current_dir();
+}
+
+static void
+on_renamed(GtkCellRenderer *renderer, const gchar *path_string, const gchar *newname, gpointer data)
+{
+
+	GtkTreeViewColumn 	*column;
+	GList 				*renderers;
+	GtkTreeIter 		iter;
+	gchar 				*uri, *newuri;
+
+	column 		= gtk_tree_view_get_column(GTK_TREE_VIEW(treeview), 0);
+	renderers 	= gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(column));
+	renderer 	= g_list_nth_data(renderers, TREEBROWSER_RENDER_TEXT);
+
+	g_object_set(G_OBJECT(renderer), "editable", FALSE, NULL);
+
+	if (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL(treestore), &iter, path_string))
+	{
+		gtk_tree_model_get(GTK_TREE_MODEL(treestore), &iter, TREEBROWSER_COLUMN_URI, &uri, -1);
+		if (uri)
+		{
+			newuri = g_strconcat(g_path_get_dirname(uri), G_DIR_SEPARATOR_S, newname, NULL);
+			if (g_rename(uri, newuri) == 0)
+				gtk_tree_store_set(treestore, &iter,
+								TREEBROWSER_COLUMN_NAME, newname,
+								TREEBROWSER_COLUMN_URI, newuri,
+								-1);
+		}
+	}
+}
+
+
+/*
+ * RIGHT CLICK MENU
+ */
+
+static void
+on_menu_external_open(GtkMenuItem *menuitem, gpointer *user_data)
+{
+
+	GtkTreeSelection 	*selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
+	GtkTreeIter 		iter;
+	GtkTreeModel 		*model;
+	gchar 				*uri;
+
+	if (gtk_tree_selection_get_selected(selection, &model, &iter))
+	{
+		gtk_tree_model_get(model, &iter, TREEBROWSER_COLUMN_URI, &uri, -1);
+		if (g_file_test(uri, G_FILE_TEST_IS_DIR))
+			utils_open_browser(uri);
+	}
+}
+
+static void
+on_menu_go_parent(GtkMenuItem *menuitem, gpointer *user_data)
+{
+	treebrowser_chroot(g_path_get_dirname(addressbar_last_address));
+}
+
+
+static void
+on_menu_set_as_root(GtkMenuItem *menuitem, gpointer *user_data)
+{
+
+	GtkTreeSelection 	*selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
+	GtkTreeIter 		iter;
+	GtkTreeModel 		*model;
+	gchar 				*uri;
+
+	if (gtk_tree_selection_get_selected(selection, &model, &iter))
+	{
+		gtk_tree_model_get(model, &iter, TREEBROWSER_COLUMN_URI, &uri, -1);
+		if (g_file_test(uri, G_FILE_TEST_IS_DIR))
+			treebrowser_chroot(uri);
+	}
+}
+
+
+static void
+on_menu_refresh(GtkMenuItem *menuitem, gpointer *user_data)
+{
+	treebrowser_chroot(addressbar_last_address);
+}
+
+static void
+on_menu_create_new_directory(GtkMenuItem *menuitem, gpointer *user_data)
+{
+	GtkTreeSelection 	*selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
+	GtkTreeIter 		iter_new;
+	gpointer 			iter = NULL;
+	GtkTreeModel 		*model;
+	gchar 				*uri, *newuri;
+
+	if (gtk_tree_selection_get_selected(selection, &model, iter))
+		gtk_tree_model_get(model, iter, TREEBROWSER_COLUMN_URI, &uri, -1);
+	else
+		uri = addressbar_last_address;
+
+	newuri = g_strconcat(uri, G_DIR_SEPARATOR_S, _("NewDirectory"), NULL);
+
+	while(g_file_test(newuri, G_FILE_TEST_EXISTS))
+		newuri = g_strconcat(newuri, "_", NULL);
+
+	if (g_mkdir(newuri, 0755) == 0)
+	{
+		gtk_tree_store_prepend(treestore, &iter_new, iter ? iter : NULL);
+		gtk_tree_store_set(treestore, &iter_new,
+							TREEBROWSER_COLUMN_ICON, GTK_STOCK_DIRECTORY,
+							TREEBROWSER_COLUMN_NAME, g_path_get_basename(newuri),
+							TREEBROWSER_COLUMN_URI, newuri,
+							-1);
+	}
+}
+
+static void
+on_menu_create_new_file(GtkMenuItem *menuitem, gpointer *user_data)
+{
+	GtkTreeSelection 		*selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
+	GtkTreeIter 			iter_new;
+	gpointer 				iter = NULL;
+	GtkTreeModel 			*model;
+	gchar 					*uri, *newuri;
+
+	if (gtk_tree_selection_get_selected(selection, &model, iter))
+		gtk_tree_model_get(model, iter, TREEBROWSER_COLUMN_URI, &uri, -1);
+	else
+		uri = addressbar_last_address;
+
+	newuri = g_strconcat(uri, G_DIR_SEPARATOR_S, _("NewFile"), NULL);
+
+	while(g_file_test(newuri, G_FILE_TEST_EXISTS))
+		newuri = g_strconcat(newuri, "_", NULL);
+
+	if (g_creat(newuri, 0755) != -1)
+	{
+		gtk_tree_store_prepend(GTK_TREE_STORE(treestore), &iter_new, iter ? iter : NULL);
+		gtk_tree_store_set(GTK_TREE_STORE(treestore), &iter_new,
+							TREEBROWSER_COLUMN_ICON, GTK_STOCK_FILE,
+							TREEBROWSER_COLUMN_NAME, g_path_get_basename(newuri),
+							TREEBROWSER_COLUMN_URI, newuri,
+							-1);
+	}
+}
+
+static void
+on_menu_delete(GtkMenuItem *menuitem, gpointer *user_data)
+{
+
+	GtkTreeSelection 	*selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
+	GtkTreeIter 		iter;
+	GtkTreeModel 		*model;
+	gchar 				*uri, *msg;
+
+	if (gtk_tree_selection_get_selected(selection, &model, &iter))
+	{
+		gtk_tree_model_get(model, &iter, TREEBROWSER_COLUMN_URI, &uri, -1);
+
+		if (dialogs_yesno(g_strdup_printf(_("Do you want to remove '%s'?"), uri)))
+		{
+			fs_remove(uri, TRUE);
+		}
+	}
+}
+
+static void
+on_menu_rename_activated(GtkMenuItem *menuitem, gpointer *user_data)
+{
+	GtkTreeSelection 	*selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
+	GtkTreeIter 		iter;
+	GtkTreeModel 		*model;
+	GtkTreeViewColumn 	*column;
+	GtkCellRenderer 	*renderer;
+	GtkTreePath 		*path;
+	GList 				*renderers;
+
+	if (gtk_tree_selection_get_selected(selection, &model, &iter))
+	{
+		path = gtk_tree_model_get_path(GTK_TREE_MODEL(treestore), &iter);
+		if (G_LIKELY(path != NULL))
+		{
+			column 		= gtk_tree_view_get_column(GTK_TREE_VIEW (treeview), 0);
+			renderers 	= gtk_cell_layout_get_cells(GTK_CELL_LAYOUT (column));
+			renderer 	= g_list_nth_data(renderers, TREEBROWSER_RENDER_TEXT);
+
+			g_object_set(G_OBJECT(renderer), "editable", TRUE, NULL);
+			gtk_tree_view_set_cursor_on_cell(GTK_TREE_VIEW(treeview), path, column, renderer, TRUE);
+
+			gtk_tree_path_free(path);
+			g_list_free(renderers);
+		}
+	}
+}
+
+
+static void
+on_menu_showhide_bars(GtkMenuItem *menuitem, gpointer *user_data)
+{
+	showbars(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)));
+}
+
+static GtkWidget*
+create_popup_menu(gpointer *user_data)
+{
+	GtkWidget *item, *menu;
+
+	menu = gtk_menu_new();
+
+	item = ui_image_menu_item_new(GTK_STOCK_GO_UP, _("Go parent"));
+	gtk_container_add(GTK_CONTAINER(menu), item);
+	g_signal_connect(item, "activate", G_CALLBACK(on_menu_go_parent), NULL);
+
+	item = ui_image_menu_item_new(GTK_STOCK_OPEN, _("Open externally"));
+	gtk_container_add(GTK_CONTAINER(menu), item);
+	g_signal_connect(item, "activate", G_CALLBACK(on_menu_external_open), NULL);
+
+	item = ui_image_menu_item_new(GTK_STOCK_OPEN, _("Set as root"));
+	gtk_container_add(GTK_CONTAINER(menu), item);
+	g_signal_connect(item, "activate", G_CALLBACK(on_menu_set_as_root), NULL);
+
+	item = gtk_separator_menu_item_new();
+	gtk_widget_show(item);
+	gtk_container_add(GTK_CONTAINER(menu), item);
+
+	item = ui_image_menu_item_new(GTK_STOCK_ADD, _("Create new directory"));
+	gtk_container_add(GTK_CONTAINER(menu), item);
+	g_signal_connect(item, "activate", G_CALLBACK(on_menu_create_new_directory), NULL);
+
+	item = ui_image_menu_item_new(GTK_STOCK_NEW, _("Create new file"));
+	gtk_container_add(GTK_CONTAINER(menu), item);
+	g_signal_connect(item, "activate", G_CALLBACK(on_menu_create_new_file), NULL);
+
+	item = ui_image_menu_item_new(GTK_STOCK_SAVE_AS, _("Rename"));
+	gtk_container_add(GTK_CONTAINER(menu), item);
+	g_signal_connect(item, "activate", G_CALLBACK(on_menu_rename_activated), NULL);
+
+	item = ui_image_menu_item_new(GTK_STOCK_DELETE, _("Delete"));
+	gtk_container_add(GTK_CONTAINER(menu), item);
+	g_signal_connect(item, "activate", G_CALLBACK(on_menu_delete), NULL);
+
+	item = gtk_separator_menu_item_new();
+	gtk_widget_show(item);
+	gtk_container_add(GTK_CONTAINER(menu), item);
+
+	item = ui_image_menu_item_new(GTK_STOCK_REFRESH, _("Refresh root"));
+	gtk_container_add(GTK_CONTAINER(menu), item);
+	g_signal_connect(item, "activate", G_CALLBACK(on_menu_refresh), NULL);
+
+	item = gtk_separator_menu_item_new();
+	gtk_widget_show(item);
+	gtk_container_add(GTK_CONTAINER(menu), item);
+
+	item = gtk_check_menu_item_new_with_mnemonic(_("Show bars"));
+	gtk_container_add(GTK_CONTAINER(menu), item);
+	gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), CONFIG_SHOW_BARS);
+	g_signal_connect(item, "activate", G_CALLBACK(on_menu_showhide_bars), NULL);
+
+	gtk_widget_show_all(menu);
+
+	return menu;
+}
+
+
+
+
+
+// SIGNALS CALLBACK FUNCTIONS
+
+
+
+static gboolean
+on_button_press(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
+{
+
+	/*if (event->button == 1 && event->type == GDK_2BUTTON_PRESS)
+	{
+		//on_open_clicked(NULL, NULL);
+		return TRUE;
+	}
+	else */ if (event->button == 3)
+	{
+		static GtkWidget *popup_menu = NULL;
+
+		if (popup_menu == NULL)
+			popup_menu = create_popup_menu(user_data);
+
+		gtk_menu_popup(GTK_MENU(popup_menu), NULL, NULL, NULL, NULL, event->button, event->time);
+		/* don't return TRUE here, unless the selection won't be changed */
+	}
+	return FALSE;
+
+}
+
+
+static void
+on_changed(GtkWidget *widget, gpointer user_data)
+{
+	GtkTreeIter 	iter;
+	GtkTreeModel 	*model;
+	gchar 			*uri;
+
+	if (gtk_tree_selection_get_selected(GTK_TREE_SELECTION(widget), &model, &iter))
+	{
+		gtk_tree_model_get(GTK_TREE_MODEL(treestore), &iter,
+							TREEBROWSER_COLUMN_URI, &uri,
+							-1);
+		treebrowser_browse(uri, iter, FALSE, CONFIG_DIRECTORY_DEEP);
+	}
+}
+
+static void
+on_row_activated (GtkWidget *widget, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
+{
+	GtkTreeIter 	iter;
+	gchar 			*uri;
+
+	gtk_tree_model_get_iter(GTK_TREE_MODEL(treestore), &iter, path);
+	gtk_tree_model_get(GTK_TREE_MODEL(treestore), &iter,
+							TREEBROWSER_COLUMN_URI,  &uri,
+							-1);
+
+	if (g_file_test (uri, G_FILE_TEST_IS_DIR))
+		if (CONFIG_CHROOT_ON_DCLICK)
+			treebrowser_chroot(uri);
+		else
+			if (gtk_tree_view_row_expanded(GTK_TREE_VIEW(widget), path))
+				gtk_tree_view_collapse_row(GTK_TREE_VIEW(widget), path);
+			else
+				gtk_tree_view_expand_row(GTK_TREE_VIEW(widget), path, FALSE);
+	else
+		document_open_file(uri, FALSE, NULL, NULL);
+}
+
+static void
+on_row_expanded(GtkWidget *widget, GtkTreeIter *iter, GtkTreePath *path, gpointer user_data)
+{
+	gtk_tree_store_set(treestore, iter, TREEBROWSER_COLUMN_ICON, GTK_STOCK_OPEN, -1);
+}
+
+static void
+on_row_collapsed(GtkWidget *widget, GtkTreeIter *iter, GtkTreePath *path, gpointer user_data)
+{
+	gtk_tree_store_set(treestore, iter, TREEBROWSER_COLUMN_ICON, GTK_STOCK_DIRECTORY, -1);
+}
+
+static void
+on_addressbar_activate(GtkEntry *entry, gpointer user_data)
+{
+	gchar *directory = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1);
+	treebrowser_chroot(directory);
+}
+
+static void
+on_addressbar_icon
+(GtkEntry *entry, GtkEntryIconPosition icon_pos, GdkEvent *event, gpointer user_data)
+{
+
+	if (icon_pos == GTK_ENTRY_ICON_PRIMARY)
+	{
+		return;
+	}
+
+	if (icon_pos == GTK_ENTRY_ICON_SECONDARY)
+	{
+		//treebrowser_track_path(get_default_dir());
+		treebrowser_chroot(get_default_dir());
+		return;
+	}
+}
+
+static void
+on_filter_activate(GtkEntry *entry, gpointer user_data)
+{
+	treebrowser_chroot(addressbar_last_address);
+}
+// END OF SIGNALS
+
+
+// SYSTEM FUNCTIONS
+
+
+static void // recursive removing files
+fs_remove(gchar *root, gboolean delete_root)
+{
+
+	if (! g_file_test(root, G_FILE_TEST_EXISTS))
+		return;
+
+	if (g_file_test(root, G_FILE_TEST_IS_DIR))
+	{
+
+		GDir *dir;
+		const gchar *name;
+
+		dir = g_dir_open (root, 0, NULL);
+
+		if (!dir)
+			return;
+
+		name = g_dir_read_name (dir);
+		while (name != NULL)
+		{
+			gchar *path;
+			path = g_build_filename (root, name, NULL);
+			if (g_file_test (path, G_FILE_TEST_IS_DIR))
+				fs_remove(path, delete_root);
+			g_remove(path);
+			name = g_dir_read_name(dir);
+			g_free (path);
+		}
+	}
+	else
+		delete_root = TRUE;
+
+	if (delete_root)
+		g_remove(root);
+
+	return;
+}
+
+static void
+showbars(gboolean state)
+{
+	if (state) 	gtk_widget_show(vbox_bars);
+	else 		gtk_widget_hide(vbox_bars);
+	CONFIG_SHOW_BARS = state;
+}
+
+static int // recursive removing all nodes and subnodes in some node :)
+gtk_tree_store_iter_clear_nodes(GtkTreeIter iter, gboolean delete_root)
+{
+	//return 0;
+	GtkTreeIter 	i;
+
+	while (gtk_tree_model_iter_children(GTK_TREE_MODEL(treestore), &i, &iter))
+	{
+		if (gtk_tree_store_iter_depth(treestore, &i) > 0)
+			gtk_tree_store_iter_clear_nodes(i, TRUE);
+
+		gtk_tree_store_remove(GTK_TREE_STORE(treestore), &i);
+	}
+
+	//if (delete_root)
+	//	gtk_tree_store_remove(GTK_TREE_STORE(treestore), &iter);
+
+	return 1;
+}
+
+static gboolean*
+treebrowser_track_path_cb(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer user_data)
+{
+	gchar *path_str, *uri;
+
+	gtk_tree_model_get(GTK_TREE_MODEL(treestore), iter, TREEBROWSER_COLUMN_URI, &uri, -1);
+
+	path_str = gtk_tree_path_to_string(path);
+
+	if (user_data == uri)
+	{
+		msgbox(uri);
+		return FALSE;
+	}
+
+	//g_free(path_str);
+	//g_free(uri);
+
+	return FALSE;
+}
+
+static void
+treebrowser_track_path(gchar *directory)
+{
+	//void                gtk_tree_view_column_set_expand     (GtkTreeViewColumn *tree_column,
+    //                                                     gboolean expand);
+	//gtk_tree_model_foreach(GTK_ENTRY(treestore), treebrowser_track_path_cb, directory);
+}
+
+static void
+treebrowser_chroot(gchar *directory)
+{
+	GtkTreeIter toplevel_unused;
+
+	gtk_entry_set_text(GTK_ENTRY(addressbar), directory);
+
+	gtk_tree_store_clear(treestore);
+
+	if (! g_file_test(directory, G_FILE_TEST_IS_DIR))
+	{
+		gtk_entry_set_icon_from_stock(GTK_ENTRY(addressbar), GTK_ENTRY_ICON_PRIMARY, GTK_STOCK_NO);
+		return;
+	}
+
+	gtk_entry_set_icon_from_stock(GTK_ENTRY(addressbar), GTK_ENTRY_ICON_PRIMARY, GTK_STOCK_DIRECTORY);
+
+	addressbar_last_address = directory;
+	treebrowser_browse(directory, toplevel_unused, TRUE, CONFIG_DIRECTORY_DEEP);
+}
+
+static void
+treebrowser_browse(gchar *directory, GtkTreeIter parent, gboolean isRoot, gint deep_limit)
+{
+	if (deep_limit < 1) return;
+	deep_limit--;
+	GtkTreeIter iter_new;
+	GtkTreeIter *last_dir_iter = NULL;
+	gchar *path, *display_name, *newpath;
+	gboolean is_dir;
+	GDir *dir;
+	const gchar *name;
+	const gchar *basename;
+	directory = g_strconcat(directory, G_DIR_SEPARATOR_S, NULL);
+
+	if (!isRoot)
+		gtk_tree_store_iter_clear_nodes(parent, FALSE);
+
+	gchar *utf8_dir, *utf8_name;
+	GSList *list, *node;
+	list = utils_get_file_list(directory, NULL, NULL);
+	if (list != NULL)
+	{
+
+		foreach_slist_free(node, list)
+		{
+			gchar *fname = node->data;
+			gchar *uri = g_strconcat(directory, fname, NULL);
+			is_dir = g_file_test (uri, G_FILE_TEST_IS_DIR);
+			utf8_name = utils_get_utf8_from_locale(fname);
+
+			if (!(fname[0] == '.' && CONFIG_SHOW_HIDDEN_FILES == FALSE))
+			{
+
+				if (is_dir)
+				{
+					if (last_dir_iter == NULL)
+						gtk_tree_store_prepend(treestore, &iter_new, isRoot ? NULL : &parent);
+					else
+					{
+						gtk_tree_store_insert_after(treestore, &iter_new, isRoot ? NULL : &parent, last_dir_iter);
+						gtk_tree_iter_free(last_dir_iter);
+					}
+					last_dir_iter = gtk_tree_iter_copy(&iter_new);
+					gtk_tree_store_set(treestore, &iter_new, 0, is_dir ? GTK_STOCK_DIRECTORY : GTK_STOCK_FILE, 1, fname, 2, uri,-1);
+
+					treebrowser_browse(uri, iter_new, FALSE, deep_limit);
+				}
+				else
+				{
+					if (check_filtered(utf8_name))
+					{
+						gtk_tree_store_append(treestore, &iter_new, isRoot ? NULL : &parent);
+						gtk_tree_store_set(treestore, &iter_new, 0, is_dir ? GTK_STOCK_DIRECTORY : GTK_STOCK_FILE, 1, fname, 2, uri,-1);
+					}
+				}
+			}
+			g_free(fname);
+			g_free(uri);
+		}
+	}
+
+}
+
+
+static GtkWidget *
+create_view_and_model (void)
+{
+
+	GtkWidget 			*view;
+
+	view 					= gtk_tree_view_new();
+	treeview_column_icon	= gtk_tree_view_column_new();
+	treeview_column_text	= gtk_tree_view_column_new();
+	render_icon 			= gtk_cell_renderer_pixbuf_new();
+	render_text 			= gtk_cell_renderer_text_new();
+
+	gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(view), FALSE);
+
+	//gtk_tree_view_append_column(GTK_TREE_VIEW(view), treeview_column_icon);
+	gtk_tree_view_append_column(GTK_TREE_VIEW(view), treeview_column_text);
+
+	gtk_tree_view_column_pack_start(treeview_column_text, render_icon, FALSE);
+	gtk_tree_view_column_set_attributes(treeview_column_text, render_icon, "stock-id", TREEBROWSER_RENDER_ICON, NULL);
+
+	//gtk_tree_view_column_set_sort_order(treeview_column_text, GTK_SORT_ASCENDING);
+	//gtk_tree_view_column_get_sort_column_id(treeview_column_text);
+	//gtk_tree_view_column_get_clickable(treeview_column_text);
+
+	gtk_tree_view_column_pack_start(treeview_column_text, render_text, TRUE);
+	gtk_tree_view_column_add_attribute(treeview_column_text, render_text, "text", TREEBROWSER_RENDER_TEXT);
+
+	treestore 	= gtk_tree_store_new(TREEBROWSER_COLUMNC,
+										G_TYPE_STRING,
+										G_TYPE_STRING,
+										G_TYPE_STRING);
+
+	gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(treestore));
+
+	g_signal_connect(G_OBJECT(render_text), "edited", 	G_CALLBACK (on_renamed), view);
+
+	return view;
+}
+
+
+void
+plugin_init(GeanyData *data)
+{
+	GtkWidget 			*scrollwin;
+	GtkTreeSelection 	*selection;
+
+	treeview 			= create_view_and_model();
+	vbox 				= gtk_vbox_new(FALSE, 0);
+	vbox_bars 			= gtk_vbox_new(FALSE, 0);
+	selection 			= gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
+	addressbar 			= gtk_entry_new();
+	filter 				= gtk_entry_new();
+
+	scrollwin 			= gtk_scrolled_window_new(NULL, NULL);
+
+	page_number 		= gtk_notebook_append_page(GTK_NOTEBOOK(geany->main_widgets->sidebar_notebook),
+							vbox, gtk_label_new(_("Tree Browser")));
+
+	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+
+	gtk_entry_set_icon_from_stock(GTK_ENTRY(filter), 			GTK_ENTRY_ICON_PRIMARY, 	GTK_STOCK_FIND);
+	gtk_entry_set_icon_from_stock(GTK_ENTRY(addressbar), 		GTK_ENTRY_ICON_PRIMARY, 	GTK_STOCK_DIRECTORY);
+	gtk_entry_set_icon_from_stock(GTK_ENTRY(addressbar), 		GTK_ENTRY_ICON_SECONDARY, 	GTK_STOCK_JUMP_TO);
+
+	gtk_container_add(GTK_CONTAINER(scrollwin), 	treeview);
+
+	gtk_box_pack_start(GTK_BOX(vbox_bars), 			filter, 			FALSE, TRUE,  1);
+	gtk_box_pack_start(GTK_BOX(vbox_bars), 			addressbar, 		FALSE, TRUE,  1);
+
+	gtk_box_pack_start(GTK_BOX(vbox), 				scrollwin, 			TRUE,  TRUE,  1);
+	gtk_box_pack_start(GTK_BOX(vbox), 				vbox_bars, 			FALSE, TRUE,  1);
+
+	g_signal_connect(selection, 		"changed", 				G_CALLBACK(on_changed), 				NULL);
+	g_signal_connect(treeview, 			"button-press-event", 	G_CALLBACK(on_button_press), 			selection);
+	g_signal_connect(treeview, 			"row-activated", 		G_CALLBACK(on_row_activated), 			NULL);
+	g_signal_connect(treeview, 			"row-collapsed", 		G_CALLBACK(on_row_collapsed), 			NULL);
+	g_signal_connect(treeview, 			"row-expanded", 		G_CALLBACK(on_row_expanded), 			NULL);
+	g_signal_connect(addressbar, 		"activate", 			G_CALLBACK(on_addressbar_activate), 	NULL);
+	g_signal_connect(addressbar, 		"icon-release",			G_CALLBACK(on_addressbar_icon), 		NULL);
+	g_signal_connect(filter, 			"activate", 			G_CALLBACK(on_filter_activate), 		NULL);
+
+	gtk_widget_show_all(vbox);
+
+	//treebrowser_chroot("/tmp");
+	treebrowser_chroot(get_default_dir());
+
+	showbars(CONFIG_SHOW_BARS);
+}
+
+
+void
+plugin_cleanup(void)
+{
+	gtk_widget_destroy(GTK_WIDGET(vbox));
+}


Property changes on: trunk/geany-plugins/treebrowser/src/treebrowser.c
___________________________________________________________________
Added: svn:mime-type
   + text/x-csrc
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Modified: trunk/geany-plugins/wscript
===================================================================
--- trunk/geany-plugins/wscript	2010-03-17 17:23:39 UTC (rev 1176)
+++ trunk/geany-plugins/wscript	2010-03-17 23:27:44 UTC (rev 1177)
@@ -99,7 +99,8 @@
 		 # maybe you need to modify the package name of Lua, try one of these: lua5.1 lua51 lua-5.1
 		 [ [ 'lua', '5.1', True ] ]),
 	Plugin('geanyprj', None, [ 'geanyprj/src' ]),
-	Plugin('pretty-printer', None, [ 'pretty-printer/src' ], [ [ 'libxml-2.0', '2.6.27', True ] ])
+	Plugin('pretty-printer', None, [ 'pretty-printer/src' ], [ [ 'libxml-2.0', '2.6.27', True ] ]),
+	Plugin('treebrowser', None, [ 'treebrowser/src' ])
 ]
 
 '''


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