SF.net SVN: geany-plugins:[1190] trunk/geany-plugins/treebrowser/src/ treebrowser.c

dimitrov-adrian at users.sourceforge.net dimitrov-adrian at xxxxx
Sat Mar 20 12:09:27 UTC 2010


Revision: 1190
          http://geany-plugins.svn.sourceforge.net/geany-plugins/?rev=1190&view=rev
Author:   dimitrov-adrian
Date:     2010-03-20 12:09:27 +0000 (Sat, 20 Mar 2010)

Log Message:
-----------
Code improvment, most of code is rewriten

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

Modified: trunk/geany-plugins/treebrowser/src/treebrowser.c
===================================================================
--- trunk/geany-plugins/treebrowser/src/treebrowser.c	2010-03-20 11:49:51 UTC (rev 1189)
+++ trunk/geany-plugins/treebrowser/src/treebrowser.c	2010-03-20 12:09:27 UTC (rev 1190)
@@ -1,25 +1,34 @@
 //      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
+/*
+ * TODO
+ * ---------------------------
+ * 		configuration dialog
+ * 		trackick path to current focused document
+ * 		Windows compitable
+ * 		Language files
+ * 		(DONE) oneclick document opening
+ * 		(DONE) filter separating ex.: "*.c;*.cpp;*.h"
+ * 		fix possible memory leaks (using g_free... where is need)
+ *
+ *
+ * Development release ChangeLog
  * -----------------------------
+ * (19-03-2010)
+ * 		clear up the syntax and function names
+ * 		fixed many bugs with renaming/creating/deleting objects
+ * 		added multiple filtering criterias
+ * 		added oneclick document opening
  *
+ * (18-03-2010)
+ * 		add option to reverse filematch filter
+ *
+ * (17-03-2010)
+ * 		migrated to dialogs_show_msgbox and dialogs_show_question
+ * 		fix problem with path initialization
+ *
  * (16-03-2010)
  * 		fix compilation warning messages
  * 		fix some crytical errors
@@ -28,18 +37,15 @@
  * 		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
  *
  */
@@ -50,29 +56,36 @@
 #include "Scintilla.h"
 
 /* These items are set by Geany before plugin_init() is called. */
-GeanyPlugin					*geany_plugin;
-GeanyData					*geany_data;
-GeanyFunctions				*geany_functions;
+GeanyPlugin 				*geany_plugin;
+GeanyData 					*geany_data;
+GeanyFunctions 				*geany_functions;
 
-static gint					page_number 				= 0;
+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 			*treeview;
+static GtkWidget 			*vbox;
+static GtkWidget 			*vbox_bars;
 static GtkWidget 			*filter;
+static GtkWidget 			*addressbar;
+static gchar 				*addressbar_last_address 	= NULL;
 
 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;
+//
+// CONFIG VARS
+//
+static gint 				CONFIG_INITIAL_DIR_DEEP 	= 1;
+static gboolean 			CONFIG_REVERSE_FILTER 		= FALSE;
+static gboolean 			CONFIG_ONE_CLICK_CHDOC 		= FALSE;
+static gboolean 			CONFIG_SHOW_HIDDEN_FILES 	= FALSE;
+static gboolean 			CONFIG_SHOW_BARS			= TRUE;
+static gboolean 			CONFIG_CHROOT_ON_DCLICK		= FALSE;
+static gboolean 			CONFIG_FOLLOW_CURRENT_DOC 	= FALSE;
 
-// treeview struct
+//
+// TREEVIEW STRUCT
+//
 enum
 {
 	TREEBROWSER_COLUMNC 								= 3,
@@ -85,151 +98,296 @@
 	TREEBROWSER_RENDER_TEXT								= 1
 };
 
-
+//
+// PLUGIN INFO
+//
 PLUGIN_VERSION_CHECK(147)
-PLUGIN_SET_INFO(_("Tree Browser"), _("Treeview filebrowser plugin."), "0.1" , " e01 (Enzo_01 at abv.bg)")
+PLUGIN_SET_INFO(_("Tree Browser"), _("Treeview filebrowser plugin."), "0.1" , "Adrian Dimitrov (dimitrov.adrian at gmail.com)")
 
 
-// predefines
-#define foreach_slist_free(node, list) \
-	for (node = list, list = NULL; g_slist_free_1(list), node != NULL; list = node, node = node->next)
+//
+// 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
 
+//
+// PROTOTYPES
+//
+static void 	treebrowser_browse(gchar *directory, gpointer parent, gint deep_limit);
+static void 	gtk_tree_store_iter_clear_nodes(gpointer iter, gboolean delete_root);
 
-static void
-msgbox(gchar *message)
+
+//
+// TREEBROWSER CORE FUNCTIONS
+//
+
+static gboolean
+check_filtered(const gchar *base_name)
 {
-	GtkWidget *window;
-	GtkWidget *dialog;
+	gchar		**filters;
+	gint 		i;
 
-	dialog = gtk_message_dialog_new(GTK_WINDOW (window),
-				GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
-				GTK_MESSAGE_INFO,
-				GTK_BUTTONS_OK,
-				"%s",
-				message);
+	if (gtk_entry_get_text_length(GTK_ENTRY(filter)) < 1)
+		return TRUE;
 
-	gtk_dialog_run(GTK_DIALOG (dialog));
-	gtk_widget_destroy(dialog);
+	filters = g_strsplit(gtk_entry_get_text(GTK_ENTRY(filter)), ";", 0);
+
+	for (i = 0; filters[i]; i++)
+		if (utils_str_equal(base_name, "*") || g_pattern_match_simple(filters[i], base_name))
+			return CONFIG_REVERSE_FILTER ? FALSE : TRUE;
+
+	return CONFIG_REVERSE_FILTER ? TRUE : FALSE;
 }
 
+static gchar*
+get_default_dir(void)
+{
+	gchar 			*dir;
+	GeanyProject 	*project 	= geany->app->project;
+	GeanyDocument	*doc 		= document_get_current();
 
-static gboolean
-dialogs_yesno(gchar *message)
+	if (doc != NULL && doc->file_name != NULL && g_path_is_absolute(doc->file_name))
+		return utils_get_locale_from_utf8(g_path_get_dirname(doc->file_name));
+
+	if (project)
+		dir = project->base_path;
+	else
+		dir = geany->prefs->default_open_path;
+
+	if (NZV(dir))
+		return utils_get_locale_from_utf8(dir);
+
+	return g_get_current_dir();
+}
+
+static void
+treebrowser_chroot(gchar *directory)
 {
-	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);
+	gtk_entry_set_text(GTK_ENTRY(addressbar), directory);
 
-	if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_YES)
+	if (! g_file_test(directory, G_FILE_TEST_IS_DIR))
 	{
-		gtk_widget_destroy(dialog);
-		return TRUE;
+		dialogs_show_msgbox(GTK_MESSAGE_ERROR, _("Directory '%s' not exists."), directory);
+		return;
 	}
-	gtk_widget_destroy(dialog);
-	return FALSE;
+
+	gtk_tree_store_clear(treestore);
+	addressbar_last_address = directory;
+	treebrowser_browse(directory, NULL, CONFIG_INITIAL_DIR_DEEP);
 }
 
+static void
+treebrowser_browse(gchar *directory, gpointer parent, gint deep_limit)
+{
+	GtkTreeIter 	iter, *last_dir_iter = NULL;
+	gchar 			*path, *path_new, *display_name;
+	gboolean 		is_dir, expanded;
+	GDir 			*dir;
 
+	const gchar 	*name, *basename;
+	gchar 			*utf8_dir, *utf8_name;
+	GSList 			*list, *node;
 
-static gboolean// get from filebrowser.c (with little modifications)
-check_filtered(const gchar *base_name)
+	GtkTreePath *gpath;
+
+	if (deep_limit < 1)
+		return;
+
+	deep_limit--;
+
+	directory = g_strconcat(directory, G_DIR_SEPARATOR_S, NULL);
+
+	if (parent && gtk_tree_view_row_expanded(GTK_TREE_VIEW(treeview), gtk_tree_model_get_path(GTK_TREE_MODEL(treestore), parent)))
+		expanded = TRUE;
+	else
+		expanded = FALSE;
+
+	gtk_tree_store_iter_clear_nodes(parent, FALSE);
+
+	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, parent);
+					else
+					{
+						gtk_tree_store_insert_after(treestore, &iter, parent, last_dir_iter);
+						gtk_tree_iter_free(last_dir_iter);
+					}
+					last_dir_iter = gtk_tree_iter_copy(&iter);
+					gtk_tree_store_set(treestore, &iter,
+										TREEBROWSER_COLUMN_ICON, GTK_STOCK_DIRECTORY,
+										TREEBROWSER_COLUMN_NAME, fname,
+										TREEBROWSER_COLUMN_URI, uri,
+										-1);
+					treebrowser_browse(uri, &iter, deep_limit);
+				}
+				else
+				{
+					if (check_filtered(utf8_name))
+					{
+						gtk_tree_store_append(treestore, &iter, parent);
+						gtk_tree_store_set(treestore, &iter,
+										TREEBROWSER_COLUMN_ICON, GTK_STOCK_FILE,
+										TREEBROWSER_COLUMN_NAME, fname,
+										TREEBROWSER_COLUMN_URI, uri,
+										-1);
+					}
+				}
+			}
+			g_free(fname);
+			g_free(uri);
+		}
+	}
+
+	if (expanded)
+		gtk_tree_view_expand_row(GTK_TREE_VIEW(treeview), gtk_tree_model_get_path(GTK_TREE_MODEL(treestore), parent), FALSE);
+
+}
+
+static gboolean
+treebrowser_search(gchar *uri, gpointer parent)
 {
-	if (gtk_entry_get_text_length(GTK_ENTRY(filter)) < 1)
-		return TRUE;
+	GtkTreeIter 	iter, iter_parent;
+	GtkTreePath 	*path;
+	gchar 			*uri_current;
 
-	if (utils_str_equal(base_name, "*") || g_pattern_match_simple(gtk_entry_get_text(GTK_ENTRY(filter)), base_name))
-		return TRUE;
+	gtk_tree_model_iter_children(GTK_TREE_MODEL(treestore), &iter, parent);
+	do
+	{
+		gtk_tree_model_get(GTK_TREE_MODEL(treestore), &iter, TREEBROWSER_COLUMN_URI, &uri_current, -1);
 
-	return FALSE;
+		if (gtk_tree_model_iter_has_child(GTK_TREE_MODEL(treestore), &iter))
+		{
+			if (treebrowser_search(uri, &iter))
+				return TRUE;
+		}
+
+		if (g_strcmp0(uri,uri_current) == 0)
+		{
+			path = gtk_tree_model_get_path(GTK_TREE_MODEL(treestore), &iter);
+			gtk_tree_view_expand_to_path(GTK_TREE_VIEW(treeview), path);
+			gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(treeview), path, TREEBROWSER_COLUMN_ICON, FALSE, 0, 0);
+			gtk_tree_view_set_cursor(GTK_TREE_VIEW(treeview), path, treeview_column_text, FALSE);
+			return TRUE;
+		}
+
+	} while(gtk_tree_model_iter_next(GTK_TREE_MODEL(treestore), &iter));
+
 }
 
-static gchar*
-get_default_dir(void)
+static void
+fs_remove(gchar *root, gboolean delete_root)
 {
-	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);
+	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
-		if (project)
-			return project->base_path;
-		else
-			if (geany->prefs)
-				return geany->prefs->default_open_path;
-			else
-				return g_get_current_dir();
+		delete_root = TRUE;
+
+	if (delete_root)
+		g_remove(root);
+
+	return;
 }
 
 static void
-on_renamed(GtkCellRenderer *renderer, const gchar *path_string, const gchar *newname, gpointer data)
+showbars(gboolean state)
 {
+	if (state) 	gtk_widget_show(vbox_bars);
+	else 		gtk_widget_hide(vbox_bars);
+	CONFIG_SHOW_BARS = state;
+}
 
-	GtkTreeViewColumn 	*column;
-	GList 				*renderers;
-	GtkTreeIter 		iter;
-	gchar 				*uri, *newuri;
+static void
+gtk_tree_store_iter_clear_nodes(gpointer iter, gboolean delete_root)
+{
+	GtkTreeIter 	i;
+	while (gtk_tree_model_iter_children(GTK_TREE_MODEL(treestore), &i, iter))
+	{
+		if (gtk_tree_model_iter_has_child(GTK_TREE_MODEL(treestore), &i))
+			gtk_tree_store_iter_clear_nodes(&i, TRUE);
+		gtk_tree_store_remove(GTK_TREE_STORE(treestore), &i);
+	}
 
-	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);
+	if (delete_root)
+		gtk_tree_store_remove(GTK_TREE_STORE(treestore), iter);
+}
 
-	g_object_set(G_OBJECT(renderer), "editable", FALSE, NULL);
+static gboolean
+treebrowser_track_current(void)
+{
 
-	if (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL(treestore), &iter, path_string))
+	GeanyDocument	*doc 		= document_get_current();
+	gchar 			*path_current, *path_search = "/";
+	gchar			**path_segments;
+	gint 			i;
+
+	if (doc != NULL && doc->file_name != NULL && g_path_is_absolute(doc->file_name))
 	{
-		gtk_tree_model_get(GTK_TREE_MODEL(treestore), &iter, TREEBROWSER_COLUMN_URI, &uri, -1);
-		if (uri)
+		path_current = utils_get_locale_from_utf8(doc->file_name);
+
+		path_segments = g_strsplit(path_current, G_DIR_SEPARATOR_S, 0);
+
+		treebrowser_search(path_current, NULL);
+
+		return FALSE;
+		for (i = 0; path_segments[i]; i++)
 		{
-			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);
+			path_search = g_build_filename(path_search, path_segments[i], NULL);
+			//dialogs_show_msgbox(GTK_MESSAGE_INFO, "%s", path_search);
+			treebrowser_search(path_search, NULL);
+			return FALSE;
 		}
+
+		return TRUE;
 	}
+	return FALSE;
 }
 
 
-/*
- * RIGHT CLICK MENU
- */
+//
+// RIGHTCLICK MENU EVENTS
+//
 
 static void
-on_menu_external_open(GtkMenuItem *menuitem, gpointer *user_data)
+on_menu_open_externally(GtkMenuItem *menuitem, gpointer *user_data)
 {
 
 	GtkTreeSelection 	*selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
@@ -246,13 +404,6 @@
 }
 
 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)
 {
 
@@ -269,70 +420,79 @@
 	}
 }
 
-
 static void
-on_menu_refresh(GtkMenuItem *menuitem, gpointer *user_data)
+on_menu_create_new_object(GtkMenuItem *menuitem, gchar *type)
 {
-	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;
+	GtkTreeIter 		iter;
 	GtkTreeModel 		*model;
-	gchar 				*uri, *newuri;
+	gchar 				*uri, *uri_new;
+	GtkTreePath 		*path_parent;
 
-	if (gtk_tree_selection_get_selected(selection, &model, iter))
-		gtk_tree_model_get(model, iter, TREEBROWSER_COLUMN_URI, &uri, -1);
+	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))
+		{
+			uri 		= g_path_get_dirname(uri);
+			path_parent = gtk_tree_model_get_path(GTK_TREE_MODEL(treestore), &iter);
+			if (gtk_tree_path_up(path_parent))
+			{
+				gtk_tree_model_get_iter(GTK_TREE_MODEL(treestore), &iter, path_parent);
+			}
+		}
+	}
+	else return;
+
+	if (type == "directory")
+		uri_new = g_strconcat(uri, G_DIR_SEPARATOR_S, _("NewDirectory"), NULL);
 	else
-		uri = addressbar_last_address;
+		if (type == "file")
+			uri_new = g_strconcat(uri, G_DIR_SEPARATOR_S, _("NewFile"), NULL);
+		else
+			return;
 
-	newuri = g_strconcat(uri, G_DIR_SEPARATOR_S, _("NewDirectory"), NULL);
+	while(g_file_test(uri_new, G_FILE_TEST_EXISTS))
+		uri_new = g_strconcat(uri_new, "_", NULL);
 
-	while(g_file_test(newuri, G_FILE_TEST_EXISTS))
-		newuri = g_strconcat(newuri, "_", NULL);
-
-	if (g_mkdir(newuri, 0755) == 0)
+	if (type == "directory")
 	{
-		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);
+		if (g_mkdir(uri_new, 0755) == 0)
+			treebrowser_browse(uri, &iter, CONFIG_INITIAL_DIR_DEEP);
 	}
+	else
+	{
+		if (g_creat(uri_new, 0755) != -1)
+			treebrowser_browse(uri, &iter, CONFIG_INITIAL_DIR_DEEP);
+	}
 }
 
 static void
-on_menu_create_new_file(GtkMenuItem *menuitem, gpointer *user_data)
+on_menu_rename(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;
+	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))
-		gtk_tree_model_get(model, iter, TREEBROWSER_COLUMN_URI, &uri, -1);
-	else
-		uri = addressbar_last_address;
+	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);
 
-	newuri = g_strconcat(uri, G_DIR_SEPARATOR_S, _("NewFile"), NULL);
+			g_object_set(G_OBJECT(renderer), "editable", TRUE, NULL);
+			gtk_tree_view_set_cursor_on_cell(GTK_TREE_VIEW(treeview), path, column, renderer, TRUE);
 
-	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);
+			gtk_tree_path_free(path);
+			g_list_free(renderers);
+		}
 	}
 }
 
@@ -343,51 +503,42 @@
 	GtkTreeSelection 	*selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
 	GtkTreeIter 		iter;
 	GtkTreeModel 		*model;
-	gchar 				*uri, *msg;
+	GtkTreePath 		*path_parent;
+	gchar 				*uri;
 
 	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)))
+		if (dialogs_show_question(_("Do you want to remove '%s'?"), uri))
 		{
 			fs_remove(uri, TRUE);
+			path_parent = gtk_tree_model_get_path(GTK_TREE_MODEL(treestore), &iter);
+			if (gtk_tree_path_up(path_parent))
+				gtk_tree_model_get_iter(GTK_TREE_MODEL(treestore), &iter, path_parent);
+			treebrowser_browse(g_path_get_dirname(uri), &iter, CONFIG_INITIAL_DIR_DEEP);
 		}
 	}
 }
 
 static void
-on_menu_rename_activated(GtkMenuItem *menuitem, gpointer *user_data)
+on_menu_refresh(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;
+	gchar 				*uri;
 
 	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);
-		}
+		gtk_tree_model_get(model, &iter, TREEBROWSER_COLUMN_URI, &uri, -1);
+		if (g_file_test(uri, G_FILE_TEST_IS_DIR))
+			treebrowser_browse(uri, &iter, CONFIG_INITIAL_DIR_DEEP);
 	}
 }
 
-
 static void
-on_menu_showhide_bars(GtkMenuItem *menuitem, gpointer *user_data)
+on_menu_show_bars(GtkMenuItem *menuitem, gpointer *user_data)
 {
 	showbars(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)));
 }
@@ -399,13 +550,9 @@
 
 	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);
+	g_signal_connect(item, "activate", G_CALLBACK(on_menu_open_externally), NULL);
 
 	item = ui_image_menu_item_new(GTK_STOCK_OPEN, _("Set as root"));
 	gtk_container_add(GTK_CONTAINER(menu), item);
@@ -417,15 +564,15 @@
 
 	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);
+	g_signal_connect(item, "activate", G_CALLBACK(on_menu_create_new_object), "directory");
 
 	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);
+	g_signal_connect(item, "activate", G_CALLBACK(on_menu_create_new_object), "file");
 
 	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);
+	g_signal_connect(item, "activate", G_CALLBACK(on_menu_rename), NULL);
 
 	item = ui_image_menu_item_new(GTK_STOCK_DELETE, _("Delete"));
 	gtk_container_add(GTK_CONTAINER(menu), item);
@@ -435,7 +582,7 @@
 	gtk_widget_show(item);
 	gtk_container_add(GTK_CONTAINER(menu), item);
 
-	item = ui_image_menu_item_new(GTK_STOCK_REFRESH, _("Refresh root"));
+	item = ui_image_menu_item_new(GTK_STOCK_REFRESH, _("Refresh"));
 	gtk_container_add(GTK_CONTAINER(menu), item);
 	g_signal_connect(item, "activate", G_CALLBACK(on_menu_refresh), NULL);
 
@@ -446,7 +593,7 @@
 	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);
+	g_signal_connect(item, "activate", G_CALLBACK(on_menu_show_bars), NULL);
 
 	gtk_widget_show_all(menu);
 
@@ -454,39 +601,67 @@
 }
 
 
+//
+// TOOLBAR`S EVENTS
+//
 
+static void
+on_button_go_up(void)
+{
+	treebrowser_chroot(g_path_get_dirname(addressbar_last_address));
+}
 
+static void
+on_button_refresh(void)
+{
+	treebrowser_chroot(addressbar_last_address);
+}
 
-// SIGNALS CALLBACK FUNCTIONS
+static void
+on_button_go_home(void)
+{
+	treebrowser_chroot(g_strdup(g_get_home_dir()));
+}
 
+static void
+on_button_current_path(void)
+{
+	treebrowser_chroot(get_default_dir());
+}
 
+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_filter_activate(GtkEntry *entry, gpointer user_data)
+{
+	treebrowser_chroot(addressbar_last_address);
+}
+
+
+//
+// TREEVIEW EVENTS
+//
+
 static gboolean
-on_button_press(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
+on_treeview_mouseclick(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
 {
-
-	/*if (event->button == 1 && event->type == GDK_2BUTTON_PRESS)
+	if (event->button == 3)
 	{
-		//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)
+on_treeview_changed(GtkWidget *widget, gpointer user_data)
 {
 	GtkTreeIter 	iter;
 	GtkTreeModel 	*model;
@@ -497,12 +672,21 @@
 		gtk_tree_model_get(GTK_TREE_MODEL(treestore), &iter,
 							TREEBROWSER_COLUMN_URI, &uri,
 							-1);
-		treebrowser_browse(uri, iter, FALSE, CONFIG_DIRECTORY_DEEP);
+		if (g_file_test(uri, G_FILE_TEST_EXISTS))
+		{
+			if (g_file_test(uri, G_FILE_TEST_IS_DIR))
+				treebrowser_browse(uri, &iter, CONFIG_INITIAL_DIR_DEEP);
+			else
+				if (CONFIG_ONE_CLICK_CHDOC)
+					document_open_file(uri, FALSE, NULL, NULL);
+		}
+		else
+			gtk_tree_store_iter_clear_nodes(&iter, TRUE);
 	}
 }
 
 static void
-on_row_activated (GtkWidget *widget, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
+on_treeview_row_activated(GtkWidget *widget, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
 {
 	GtkTreeIter 	iter;
 	gchar 			*uri;
@@ -525,238 +709,149 @@
 }
 
 static void
-on_row_expanded(GtkWidget *widget, GtkTreeIter *iter, GtkTreePath *path, gpointer user_data)
+on_treeview_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)
+on_treeview_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)
+on_treeview_renamed(GtkCellRenderer *renderer, const gchar *path_string, const gchar *name_new, gpointer 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)
-{
+	GtkTreeViewColumn 	*column;
+	GList 				*renderers;
+	GtkTreeIter 		iter, iter_parent;
+	gchar 				*uri, *uri_new;
+	GtkTreePath 		*path_parent;
 
-	if (icon_pos == GTK_ENTRY_ICON_PRIMARY)
-	{
-		return;
-	}
+	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);
 
-	if (icon_pos == GTK_ENTRY_ICON_SECONDARY)
-	{
-		//treebrowser_track_path(get_default_dir());
-		treebrowser_chroot(get_default_dir());
-		return;
-	}
-}
+	g_object_set(G_OBJECT(renderer), "editable", FALSE, NULL);
 
-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))
+	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)
+		{
+			uri_new = g_strconcat(g_path_get_dirname(uri), G_DIR_SEPARATOR_S, name_new, NULL);
+			if (g_rename(uri, uri_new) == 0)
+			{
+				gtk_tree_store_set(treestore, &iter,
+								TREEBROWSER_COLUMN_NAME, name_new,
+								TREEBROWSER_COLUMN_URI, uri_new,
+								-1);
 
-		GDir *dir;
-		const gchar *name;
+				path_parent = gtk_tree_model_get_path(GTK_TREE_MODEL(treestore), &iter);
 
-		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);
+				if (gtk_tree_path_up(path_parent))
+				{
+					if (gtk_tree_model_get_iter(GTK_TREE_MODEL(treestore), &iter_parent, path_parent))
+						treebrowser_browse(g_path_get_dirname(uri_new), &iter_parent, CONFIG_INITIAL_DIR_DEEP);
+					else
+						treebrowser_browse(g_path_get_dirname(uri_new), NULL, CONFIG_INITIAL_DIR_DEEP);
+				}
+				else
+					treebrowser_browse(g_path_get_dirname(uri_new), NULL, CONFIG_INITIAL_DIR_DEEP);
+			}
 		}
 	}
-	else
-		delete_root = TRUE;
+}
 
-	if (delete_root)
-		g_remove(root);
 
-	return;
-}
-
 static void
-showbars(gboolean state)
+treebrowser_track_current_cb(void)
 {
-	if (state) 	gtk_widget_show(vbox_bars);
-	else 		gtk_widget_hide(vbox_bars);
-	CONFIG_SHOW_BARS = state;
+	if (CONFIG_FOLLOW_CURRENT_DOC)
+		treebrowser_track_current_cb();
 }
+//
+// TREEBROWSER INITIAL FUNCTIONS
+//
 
-static int // recursive removing all nodes and subnodes in some node :)
-gtk_tree_store_iter_clear_nodes(GtkTreeIter iter, gboolean delete_root)
+static void
+create_sidebar(void)
 {
-	//return 0;
-	GtkTreeIter 	i;
+	GtkWidget 			*scrollwin;
+	GtkWidget 			*toolbar;
+	GtkWidget 			*wid;
+	GtkTreeSelection 	*selection;
 
-	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);
+	vbox 				= gtk_vbox_new(FALSE, 0);
+	vbox_bars 			= gtk_vbox_new(FALSE, 0);
 
-		gtk_tree_store_remove(GTK_TREE_STORE(treestore), &i);
-	}
+	selection 			= gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
+	addressbar 			= gtk_entry_new();
+	filter 				= gtk_entry_new();
 
-	//if (delete_root)
-	//	gtk_tree_store_remove(GTK_TREE_STORE(treestore), &iter);
+	scrollwin 			= gtk_scrolled_window_new(NULL, NULL);
 
-	return 1;
-}
+	page_number 		= gtk_notebook_append_page(GTK_NOTEBOOK(geany->main_widgets->sidebar_notebook),
+							vbox, gtk_label_new(_("Tree Browser")));
 
-static gboolean*
-treebrowser_track_path_cb(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer user_data)
-{
-	gchar *path_str, *uri;
+	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
 
-	gtk_tree_model_get(GTK_TREE_MODEL(treestore), iter, TREEBROWSER_COLUMN_URI, &uri, -1);
+	toolbar = gtk_toolbar_new();
+	gtk_toolbar_set_icon_size(GTK_TOOLBAR(toolbar), GTK_ICON_SIZE_MENU);
+	gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS);
 
-	path_str = gtk_tree_path_to_string(path);
+	wid = GTK_WIDGET(gtk_tool_button_new_from_stock(GTK_STOCK_GO_UP));
+	ui_widget_set_tooltip_text(wid, _("Go up"));
+	g_signal_connect(wid, "clicked", G_CALLBACK(on_button_go_up), NULL);
+	gtk_container_add(GTK_CONTAINER(toolbar), wid);
 
-	if (user_data == uri)
-	{
-		msgbox(uri);
-		return FALSE;
-	}
+	wid = GTK_WIDGET(gtk_tool_button_new_from_stock(GTK_STOCK_REFRESH));
+	ui_widget_set_tooltip_text(wid, _("Refresh"));
+	g_signal_connect(wid, "clicked", G_CALLBACK(on_button_refresh), NULL);
+	gtk_container_add(GTK_CONTAINER(toolbar), wid);
 
-	//g_free(path_str);
-	//g_free(uri);
+	wid = GTK_WIDGET(gtk_tool_button_new_from_stock(GTK_STOCK_HOME));
+	ui_widget_set_tooltip_text(wid, _("Home"));
+	g_signal_connect(wid, "clicked", G_CALLBACK(on_button_go_home), NULL);
+	gtk_container_add(GTK_CONTAINER(toolbar), wid);
 
-	return FALSE;
-}
+	wid = GTK_WIDGET(gtk_tool_button_new_from_stock(GTK_STOCK_JUMP_TO));
+	ui_widget_set_tooltip_text(wid, _("Set path from document"));
+	g_signal_connect(wid, "clicked", G_CALLBACK(on_button_current_path), NULL);
+	gtk_container_add(GTK_CONTAINER(toolbar), wid);
 
-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);
-}
+	wid = GTK_WIDGET(gtk_tool_button_new_from_stock(GTK_STOCK_DIRECTORY));
+	ui_widget_set_tooltip_text(wid, _("Track path"));
+	g_signal_connect(wid, "clicked", G_CALLBACK(treebrowser_track_current), NULL);
+	gtk_container_add(GTK_CONTAINER(toolbar), wid);
 
-static void
-treebrowser_chroot(gchar *directory)
-{
-	GtkTreeIter toplevel_unused;
+	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_bars), 			toolbar, 			FALSE, TRUE,  1);
 
-	gtk_entry_set_text(GTK_ENTRY(addressbar), directory);
+	gtk_box_pack_start(GTK_BOX(vbox), 				scrollwin, 			TRUE,  TRUE,  1);
+	gtk_box_pack_start(GTK_BOX(vbox), 				vbox_bars, 			FALSE, TRUE,  1);
 
-	gtk_tree_store_clear(treestore);
+	g_signal_connect(selection, 		"changed", 				G_CALLBACK(on_treeview_changed), 				NULL);
+	g_signal_connect(treeview, 			"button-press-event", 	G_CALLBACK(on_treeview_mouseclick), 						selection);
+	g_signal_connect(treeview, 			"row-activated", 		G_CALLBACK(on_treeview_row_activated), 			NULL);
+	g_signal_connect(treeview, 			"row-collapsed", 		G_CALLBACK(on_treeview_row_collapsed), 			NULL);
+	g_signal_connect(treeview, 			"row-expanded", 		G_CALLBACK(on_treeview_row_expanded), 			NULL);
+	g_signal_connect(addressbar, 		"activate", 			G_CALLBACK(on_addressbar_activate), 			NULL);
+	g_signal_connect(filter, 			"activate", 			G_CALLBACK(on_filter_activate), 				NULL);
 
-	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_widget_show_all(vbox);
 
-	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);
+	showbars(CONFIG_SHOW_BARS);
 }
 
-static void
-treebrowser_browse(gchar *directory, GtkTreeIter parent, gboolean isRoot, gint deep_limit)
+static GtkWidget*
+create_view_and_model(void)
 {
-	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();
@@ -767,83 +862,115 @@
 
 	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);
+	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);
+	g_signal_connect(G_OBJECT(render_text), "edited", G_CALLBACK(on_treeview_renamed), view);
 
 	return view;
 }
 
 
-void
-plugin_init(GeanyData *data)
+//
+// CONFIG DIALOG
+//
+
+static void
+on_configure_response(GtkDialog *dialog, gint response, gpointer user_data)
 {
-	GtkWidget 			*scrollwin;
-	GtkTreeSelection 	*selection;
+	if (! (response == GTK_RESPONSE_OK || response == GTK_RESPONSE_APPLY))
+		return;
 
-	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();
+	//dialogs_show_msgbox(GTK_MESSAGE_INFO, "OKAY");
 
-	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")));
+GtkWidget*
+plugin_configure(GtkDialog *dialog)
+{
+	GtkWidget *label, *entry, *checkbox;
+	GtkWidget *vbox, *hbox;
 
-	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwin), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+	vbox = gtk_vbox_new(FALSE, 0);
 
-	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);
+	label = gtk_label_new(_("This is experimental and not working for now."));
+	gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
 
-	gtk_container_add(GTK_CONTAINER(scrollwin), 	treeview);
+	hbox = gtk_hbox_new(FALSE, 0);
+	label = gtk_label_new(_("External open command: "));
+	gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
+	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+	entry = gtk_entry_new();
+	gtk_box_pack_start(GTK_BOX(hbox), entry, FALSE, FALSE, 0);
+	gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 6);
 
-	gtk_box_pack_start(GTK_BOX(vbox_bars), 			filter, 			FALSE, TRUE,  1);
-	gtk_box_pack_start(GTK_BOX(vbox_bars), 			addressbar, 		FALSE, TRUE,  1);
+	hbox = gtk_hbox_new(FALSE, 0);
+	label = gtk_label_new(_("Initial directory deep: "));
+	gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
+	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+	entry = gtk_entry_new();
+	gtk_box_pack_start(GTK_BOX(hbox), entry, FALSE, FALSE, 0);
+	gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 6);
 
-	gtk_box_pack_start(GTK_BOX(vbox), 				scrollwin, 			TRUE,  TRUE,  1);
-	gtk_box_pack_start(GTK_BOX(vbox), 				vbox_bars, 			FALSE, TRUE,  1);
+	checkbox = gtk_check_button_new_with_label(_("Show hidden files"));
+	gtk_button_set_focus_on_click(GTK_BUTTON(checkbox), FALSE);
+	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbox), CONFIG_SHOW_HIDDEN_FILES);
+	gtk_box_pack_start(GTK_BOX(vbox), checkbox, FALSE, FALSE, 0);
 
-	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);
+	checkbox = gtk_check_button_new_with_label(_("Reverse filter"));
+	gtk_button_set_focus_on_click(GTK_BUTTON(checkbox), FALSE);
+	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbox), CONFIG_REVERSE_FILTER);
+	gtk_box_pack_start(GTK_BOX(vbox), checkbox, FALSE, FALSE, 0);
 
+	checkbox = gtk_check_button_new_with_label(_("Follow path"));
+	gtk_button_set_focus_on_click(GTK_BUTTON(checkbox), FALSE);
+	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbox), CONFIG_FOLLOW_CURRENT_DOC);
+	gtk_box_pack_start(GTK_BOX(vbox), checkbox, FALSE, FALSE, 0);
+
+	checkbox = gtk_check_button_new_with_label(_("On click document change"));
+	gtk_button_set_focus_on_click(GTK_BUTTON(checkbox), FALSE);
+	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbox), CONFIG_ONE_CLICK_CHDOC);
+	gtk_box_pack_start(GTK_BOX(vbox), checkbox, FALSE, FALSE, 0);
+
+	checkbox = gtk_check_button_new_with_label(_("Chroot on dclick"));
+	gtk_button_set_focus_on_click(GTK_BUTTON(checkbox), FALSE);
+	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbox), CONFIG_CHROOT_ON_DCLICK);
+	gtk_box_pack_start(GTK_BOX(vbox), checkbox, FALSE, FALSE, 0);
+
 	gtk_widget_show_all(vbox);
 
-	//treebrowser_chroot("/tmp");
-	treebrowser_chroot(get_default_dir());
+	g_signal_connect(dialog, "response", G_CALLBACK(on_configure_response), NULL);
 
-	showbars(CONFIG_SHOW_BARS);
+	return vbox;
 }
 
 
+//
+// GEANY HOOKS
+//
+
 void
+plugin_init(GeanyData *data)
+{
+	treeview = create_view_and_model();
+	create_sidebar();
+	treebrowser_chroot(get_default_dir());
+	//treebrowser_chroot("/tmp");
+
+	plugin_signal_connect(geany_plugin, NULL, "document-activate", TRUE,
+		(GCallback) &treebrowser_track_current_cb, NULL);
+}
+
+void
 plugin_cleanup(void)
 {
 	gtk_widget_destroy(GTK_WIDGET(vbox));


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