[gnome-commander/treeview] treeview: the valgrind release



commit 5797c0696a176a432bee590193e99bb92d36e357
Author: Guillaume Wardavoir <earlgrey free fr>
Date:   Fri Aug 13 22:51:48 2010 +0200

    treeview: the valgrind release

 src/Makefile.am                     |   11 +-
 src/gnome-cmd-foldview-control.cc   |   93 ++-
 src/gnome-cmd-foldview-gvfs.cc      |  144 +++-
 src/gnome-cmd-foldview-gvfs.h       |  109 +--
 src/gnome-cmd-foldview-model.cc     |  422 +++++++---
 src/gnome-cmd-foldview-private.h    |  202 +++--
 src/gnome-cmd-foldview-treestore.cc | 1483 +++++++++++++++++++++++++++++++++++
 src/gnome-cmd-foldview-treestore.h  |  280 +++++++
 src/gnome-cmd-foldview-view.cc      |  119 ++-
 src/gnome-cmd-foldview.cc           |   28 +
 10 files changed, 2486 insertions(+), 405 deletions(-)
---
diff --git a/src/Makefile.am b/src/Makefile.am
index 2700205..50ca65b 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -49,12 +49,13 @@ gnome_commander_SOURCES = \
 	gnome-cmd-file-props-dialog.h gnome-cmd-file-props-dialog.cc \
 	gnome-cmd-file-selector.h gnome-cmd-file-selector.cc \
 	gnome-cmd-file.h gnome-cmd-file.cc \
-	gnome-cmd-foldview.h gnome-cmd-foldview.cc \
-	gnome-cmd-foldview-control.cc \
+	gnome-cmd-foldview.h \
+	gnome-cmd-foldview-private.h  gnome-cmd-foldview.cc \
 	gnome-cmd-foldview-gvfs.h gnome-cmd-foldview-gvfs.cc \
-	gnome-cmd-foldview-model.cc \
-	gnome-cmd-foldview-private.h \
+	gnome-cmd-foldview-treestore.h gnome-cmd-foldview-treestore.cc \
 	gnome-cmd-foldview-view.cc \
+	gnome-cmd-foldview-model.cc \
+	gnome-cmd-foldview-control.cc \
 	gnome-cmd-hintbox.h gnome-cmd-hintbox.cc \
 	gnome-cmd-includes.h \
 	gnome-cmd-key-shortcuts-dialog.h gnome-cmd-key-shortcuts-dialog.cc \
@@ -122,5 +123,3 @@ gnome_commander_LDADD = \
 	$(PYTHON_EXTRA_LIBS)
 
 gcmd_block_SOURCES = block.cc
-
--include $(top_srcdir)/git.mk
diff --git a/src/gnome-cmd-foldview-control.cc b/src/gnome-cmd-foldview-control.cc
index c994aab..94ada2d 100644
--- a/src/gnome-cmd-foldview-control.cc
+++ b/src/gnome-cmd-foldview-control.cc
@@ -238,7 +238,7 @@ void GcmdGtkFoldview::control_set_active_tab(GtkTreePath *path)
 {
 	GnomeCmdFileSelector	*fs		= NULL;
 	GnomeVFSURI				*uri	= NULL;
-	GtkTreeIter				iter	= Model::s_iter_NULL;
+	GtkTreeIter				iter	= Model::Iter_zero;
 	//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 	//gwr_inf("control_open_active_tab");
 
@@ -247,7 +247,7 @@ void GcmdGtkFoldview::control_set_active_tab(GtkTreePath *path)
 		return;
 
 	// get the path from the item selectionned in the treeview
-	if ( !model.iter_from_path(path, &iter) )
+	if ( !model.get_iter(path, &iter) )
 		return;
 
 	uri = model.iter_get_uri_new(&iter);
@@ -271,11 +271,11 @@ void GcmdGtkFoldview::control_open_new_tab(GtkTreePath *path)
 	GnomeVFSURI		*uri			= NULL;
 	GnomeCmdPath	*gnomecmdpath   = NULL;
 	GnomeCmdDir		*gnomecmddir	= NULL;
-	GtkTreeIter		iter			= Model::s_iter_NULL;
+	GtkTreeIter		iter			= Model::Iter_zero;
 
 	//gwr_inf("control_open_new_tab");
 
-	if ( !model.iter_from_path(path, &iter) )
+	if ( !model.get_iter(path, &iter) )
 		return;
 
 	uri = model.iter_get_uri_new(&iter);
@@ -302,11 +302,11 @@ void GcmdGtkFoldview::Control_set_new_root(
 void GcmdGtkFoldview::control_set_new_root(GcmdGtkFoldview::View::ctx_menu_data *ctxdata)
 {
 	GnomeVFSURI		*uri			= NULL;
-	GtkTreeIter		iter			= Model::s_iter_NULL;
+	GtkTreeIter		iter			= Model::Iter_zero;
 	//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 	//gwr_inf("control_set_new_root");
 
-	if ( !model.iter_from_path(ctxdata->d_path_selected, &iter) )
+	if ( !model.get_iter(ctxdata->d_path_selected, &iter) )
 		return;
 
 	uri = model.iter_get_uri_new(&iter);
@@ -357,7 +357,7 @@ void GcmdGtkFoldview::Control_sync_update(
 void GcmdGtkFoldview::control_sync_update(GcmdGtkFoldview::View::ctx_menu_data *ctxdata)
 {
 	GnomeVFSURI		*uri			= NULL;
-	GtkTreeIter		iter			= Model::s_iter_NULL;
+	GtkTreeIter		iter			= Model::Iter_zero;
 	//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 	//gwr_inf("control_sync_update");
 	
@@ -367,7 +367,7 @@ void GcmdGtkFoldview::control_sync_update(GcmdGtkFoldview::View::ctx_menu_data *
 		return;
 	}
 
-	if ( !model.iter_from_path(ctxdata->d_path_clicked, &iter) )
+	if ( !model.get_iter(ctxdata->d_path_clicked, &iter) )
 		return;
 
 	uri = model.iter_get_uri_new(&iter);
@@ -424,14 +424,14 @@ void GcmdGtkFoldview::control_sync_treeview(GcmdGtkFoldview::View::ctx_menu_data
 {
 	GnomeCmdFileList	*list			= NULL;
 	GnomeVFSURI			*uri			= NULL;
-	GtkTreeIter			iter			= Model::s_iter_NULL;
+	GtkTreeIter			iter			= Model::Iter_zero;
 	//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 	//gwr_inf("control_sync_treeview");
 
 	// We use weak pointers on the GnomeCmdFileList so if the user close
 	// the tab, we can know it coz the weak pointer is set to NULL by glib
 
-	if ( !model.iter_from_path(ctxdata->d_path_selected, &iter) )
+	if ( !model.get_iter(ctxdata->d_path_selected, &iter) )
 	{
 		gwr_wng("control_sync_treeview:no selected item");
 		return;
@@ -512,10 +512,10 @@ void GcmdGtkFoldview::control_iter_expand_callback_1(gvfs_async *ga)
 	gint								i			= 0;
 	gint								count		= 0;
 
-	GtkTreeIter							*child_iter			= NULL;
+	GtkTreeIter							child_iter			= GcmdGtkFoldview::Model::Iter_zero;
 
 	GtkTreePath							*parent_path_gtk	= NULL;
-	GtkTreeIter							*parent_iter		= NULL;
+	GtkTreeIter							parent_iter			= GcmdGtkFoldview::Model::Iter_zero;
 
 	gboolean							b					= FALSE;
 	//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@@ -528,14 +528,15 @@ void GcmdGtkFoldview::control_iter_expand_callback_1(gvfs_async *ga)
 	count			= ls->len();
 
 	parent_path_gtk = gtk_tree_path_new_from_string(ls->ppath());
-	parent_iter		= Model::Iter_new(NULL);
-	child_iter		= Model::Iter_new(NULL);
-	if ( !gtk_tree_model_get_iter(foldview->model.treemodel(), parent_iter, parent_path_gtk) )
+
+	if ( !foldview->model.get_iter(parent_path_gtk, &parent_iter) )
 	{
 		CIE_ERR("ciec_1:gtk_tree_model_get_iter failed for parent !");
 		return;
 	}
-	CIE_INF("ciec_1:[0x%16x][0x%16x]", parent_iter, child_iter);
+	gtk_tree_path_free(parent_path_gtk);
+
+	CIE_INF("ciec_1:[0x%16x][0x%16x]", &parent_iter, &child_iter);
 	// check is name is the same												// __GWR__TODO__
 
 	//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@@ -567,11 +568,11 @@ void GcmdGtkFoldview::control_iter_expand_callback_1(gvfs_async *ga)
 		// add to the model
 		if ( i == 0 )
 		{
-			foldview->model.iter_replace_first_child(parent_iter, child_iter, file->name(), icon);
+			foldview->model.iter_replace_first_child(&parent_iter, &child_iter, file->name(), icon);
 		}
 		else
 		{
-			foldview->model.iter_add_child(parent_iter, child_iter, file->name(), icon);
+			foldview->model.iter_add_child(&parent_iter, &child_iter, file->name(), icon);
 		}
 
 		// NOTHING here ! Because the sort function mix all - iter or path !!!
@@ -582,12 +583,22 @@ void GcmdGtkFoldview::control_iter_expand_callback_1(gvfs_async *ga)
 
 	//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 	// loop 2 : check if children are empty or not
-	b = gtk_tree_model_iter_children( foldview->model.treemodel(), child_iter, parent_iter);
+#ifdef __GTS__
+	b = gtk_tree_model_iter_children( foldview->model.treemodel(), &child_iter, &parent_iter);
+	while ( b )
+	{
+		foldview->control_check_if_empty(&child_iter);
+		b = gtk_tree_model_iter_next( foldview->model.treemodel(), &child_iter);
+	}
+#else
+	b = GnomeCmdFoldviewTreestore::iter_children( foldview->model.treemodel(), &child_iter, &parent_iter);
 	while ( b )
 	{
-		foldview->control_check_if_empty(child_iter);
-		b = gtk_tree_model_iter_next( foldview->model.treemodel(), child_iter);
+		foldview->control_check_if_empty(&child_iter);
+		b = GnomeCmdFoldviewTreestore::iter_next( foldview->model.treemodel(), &child_iter);
 	}
+#endif
+
 
 	// delete user data
 	delete ga->cd();
@@ -642,7 +653,12 @@ GcmdGtkFoldview::control_iter_expand(
 	// string representing the GtkTreePath of the parent ; we dont use 
 	// a GtkTreePath directly,since it is a GtkObject and maybe invalided
 	// when GVFS callback code will run. Neither use we any GtkTreeIter.
+#ifdef __GTS__
 	temp_path   = gtk_tree_model_get_path(model.treemodel(), parent);
+#else
+	temp_path   = GnomeCmdFoldviewTreestore::get_path(model.treemodel(), parent);
+#endif
+
 	parent_path = gtk_tree_path_to_string(temp_path);
 	gtk_tree_path_free(temp_path);
 
@@ -674,10 +690,10 @@ void GcmdGtkFoldview::control_check_if_empty_callback_1(gvfs_async *ga)
 
 	gchar								*str		= NULL;
 
-	GtkTreeIter							*child_iter			= NULL;
+	GtkTreeIter							child_iter  = GcmdGtkFoldview::Model::Iter_zero;
 
 	GtkTreePath							*parent_path_gtk	= NULL;
-	GtkTreeIter							*parent_iter		= NULL;
+	GtkTreeIter							parent_iter	= GcmdGtkFoldview::Model::Iter_zero;
 	//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 	gdk_threads_enter();														// _GDK_LOCK_
 	
@@ -691,30 +707,31 @@ void GcmdGtkFoldview::control_check_if_empty_callback_1(gvfs_async *ga)
 	// Ex : filesystem notification, user click...
 	// This is a BIG problem. Maybe queue requests ?
 	parent_path_gtk = gtk_tree_path_new_from_string(ls->ppath());
-	parent_iter		= Model::Iter_new(NULL);
-	child_iter		= Model::Iter_new(NULL);
-	if ( !gtk_tree_model_get_iter(foldview->model.treemodel(), parent_iter, parent_path_gtk) )
+
+	if ( !foldview->model.get_iter(parent_path_gtk, &parent_iter) )
 	{
 		CCIE_ERR("cciec_1:gtk_tree_model_get_iter failed for parent !");
 		return;
 	}
+	gtk_tree_path_free(parent_path_gtk);
+
 	// check is name is the same												// __GWR__TODO__
-	CCIE_INF("cciec_1:[0x%16x][0x%16x]", parent_iter, child_iter);
+	CCIE_INF("cciec_1:[0x%16x][0x%16x]", &parent_iter, &child_iter);
 	if ( count > 0 )
 	{
-		foldview->model.iter_add_child(parent_iter, child_iter, "... Working ...", GcmdGtkFoldview::eAccessReadWrite);
+		foldview->model.iter_add_child(&parent_iter, &child_iter, "... Working ...", View::eIconUnknown);
 
-		str = foldview->model.iter_get_string_new(parent_iter);
+		str = foldview->model.iter_get_string_new(&parent_iter);
 		CCIE_INF("cciec_1:adding dummy to parent:[0x%16x]-[0x%16x]-[0x%16x][0x%16x][0x%16x] %s | %s",
-			parent_iter, parent_iter->stamp, parent_iter->user_data, parent_iter->user_data2, parent_iter->user_data3,
+			&parent_iter, parent_iter.stamp, parent_iter.user_data, parent_iter.user_data2, parent_iter.user_data3,
 			str, ls->ppath());
 		g_free(str);
 	}
 	else
 	{
-		str = foldview->model.iter_get_string_new(parent_iter);
-		CCIE_INF("cciec_1:adding nothing to parent:[0x%16x]-[0x%16x]-[0x%16x][0x%16x][0x%16x] %s | %s",
-			parent_iter, parent_iter->stamp, parent_iter->user_data, parent_iter->user_data2, parent_iter->user_data3,
+		str = foldview->model.iter_get_string_new(&parent_iter);
+		CCIE_INF("cciec_1:adding dummy to parent:[0x%16x]-[0x%16x]-[0x%16x][0x%16x][0x%16x] %s | %s",
+			&parent_iter, parent_iter.stamp, parent_iter.user_data, parent_iter.user_data2, parent_iter.user_data3,
 			str, ls->ppath());
 	}
 
@@ -758,7 +775,11 @@ void GcmdGtkFoldview::control_check_if_empty(GtkTreeIter *parent)
 	// string representing the GtkTreePath of the parent ; we dont use 
 	// a GtkTreePath directly,since it is a GtkObject and maybe invalided
 	// when GVFS callback code will run. Neither use we any GtkTreeIter.
+#ifdef __GTS__
 	temp_path   = gtk_tree_model_get_path(model.treemodel(), parent);
+#else
+	temp_path   = GnomeCmdFoldviewTreestore::get_path(model.treemodel(), parent);
+#endif
 	parent_path = gtk_tree_path_to_string(temp_path);
 
 		gchar   *str = gtk_tree_path_to_string( temp_path );
@@ -771,7 +792,7 @@ void GcmdGtkFoldview::control_check_if_empty(GtkTreeIter *parent)
 	control_check_if_empty_p(parent_uri, parent_path);
 }
 
-//============================================================================= // _GWR_TODO_ see FAM stuff
+//============================================================================= // _GWR_TODO_ MONITORING
 //  Item collapsed
 //  - Remove all subdirs
 //  - Add [DUMMY] ( we have been callapsed, so there were subdirs in there )
@@ -788,9 +809,9 @@ GtkTreeIter *parent)
 
 	removed = model.iter_remove_children(parent);
 
-	//gwr_inf("control_iter_collapsed:removed %03i children", removed);
+	gwr_inf("control::iter_collapsed:removed %03i children", removed);
 
-	// we have been collapsed, so we have children ; so re-add dummy child
+	// we have been collapsed, so we had children ; so re-add dummy child
 	model.iter_add_child(parent, &child, "...Working...", View::eIconUnknown);
 }
 //=============================================================================
diff --git a/src/gnome-cmd-foldview-gvfs.cc b/src/gnome-cmd-foldview-gvfs.cc
index f8071a7..7e83684 100644
--- a/src/gnome-cmd-foldview-gvfs.cc
+++ b/src/gnome-cmd-foldview-gvfs.cc
@@ -111,20 +111,73 @@ void gwr_gvfs_err(const char* fmt, ...)
 
 #endif
 
+//  ###########################################################################
+//  ###																		###
+//  ##																		 ##
+//  #						File, Dir, ...	Structs							  #
+//  ##																		 ##
+//  ###																		###
+//  ###########################################################################
+
+//
+//  Hope it is standard C++ 
+//
+//  new in code -> operator new -> constructor
+//  delete in code -> destructor -> operator delete
+//
+gvfs_file::gvfs_file(gchar *name, GnomeVFSResult result, GnomeVFSFilePermissions permissions, GnomeVFSFileType type, GnomeVFSFileFlags flags)
+{
+	d_name			= name;
+
+	a_vfsresult		= result;
+	a_vfstype		= type;
+	a_vfsflags		= flags;
+
+	a_access		= GcmdGtkFoldview::Access_from_permissions(permissions);
+}
+gvfs_file::~gvfs_file()
+{
+	//printf("==>~gvfs_fil()\n");
+	g_free (d_name);					
+}
+
+
+
+
+gvfs_dir::gvfs_dir(gchar *name, GnomeVFSFilePermissions permissions, GnomeVFSFileFlags flags) :
+	gvfs_file(name, GNOME_VFS_OK, permissions, GNOME_VFS_FILE_TYPE_DIRECTORY, flags)
+{
+}
+gvfs_dir::~gvfs_dir()
+{
+	//printf("==>~gvfs_dir()\n");
+}
+
+
 
 
+gvfs_symlink::gvfs_symlink(gchar *name, GnomeVFSFilePermissions permissions, GnomeVFSFileFlags flags) :
+	gvfs_file(name, GNOME_VFS_OK, permissions, GNOME_VFS_FILE_TYPE_SYMBOLIC_LINK, flags)
+{
+}
+gvfs_symlink::~gvfs_symlink()
+{
+	//printf("==>~gvfs_dir()\n");
+}
+//  ###########################################################################
+//  ###																		###
+//  ##																		 ##
+//  #						Gnome VFS - Misc								  #
+//  ##																		 ##
+//  ###																		###
+//  ###########################################################################
+
 //=============================================================================
 //  Common vars
 //=============================================================================
 static  GnomeVFSResult  sVFSResult		= GNOME_VFS_OK;	 // for sync operations
 
 
-//  ***************************************************************************
-//  *																		  *
-//  *						Gnome VFS - Misc							      *
-//  *																		  *
-//  ***************************************************************************
-
 gboolean																		// __GWR__TODO__ inline
 GVFS_vfsinfo_has_type_directory(
 	GnomeVFSFileInfo	*info)
@@ -179,12 +232,13 @@ GVFS_uri_new(const gchar *text)
 	return uri;
 }
 
-
-//  ***************************************************************************
-//  *																		  *
-//  *						Gnome VFS - Sync ops						      *
-//  *																		  *
-//  ***************************************************************************
+//  ###########################################################################
+//  ###																		###
+//  ##																		 ##
+//  #						Gnome VFS - Sync ops							  #
+//  ##																		 ##
+//  ###																		###
+//  ###########################################################################
 
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 //  Test if an uri exists
@@ -241,12 +295,14 @@ static gboolean gvfs_dir_has_subdirs(GnomeVFSURI *uri)
 	return bRes;;
 }
 */
-//  ***************************************************************************
-//  *																		  *
-//  *						Gnome VFS - Async ops						      *
-//  *																		  *
-//  ***************************************************************************
-//static  GStaticMutex GVFS_qstack_Mutex	= G_STATIC_MUTEX_INIT;						__GWR__TODO__
+//  ###########################################################################
+//  ###																		###
+//  ##																		 ##
+//  #					Gnome VFS - Async ops ( handles )					  #
+//  ##																		 ##
+//  ###																		###
+//  ###########################################################################
+//static  GStaticMutex GVFS_qstack_Mutex	= G_STATIC_MUTEX_INIT;						__GWR__TODO__ ?
 
 //=============================================================================
 //  Handles for vfs async ops
@@ -270,7 +326,7 @@ static  guint32					GVFS_qstack_size	= 0;
 
 static  GnomeVFSAsyncHandle**	GVFS_qstack_el		= NULL;
 static  guint32*				GVFS_qstack_ix		= NULL;
-static  guint32					GVFS_qstack_ff		= 0;
+static  guint32					GVFS_qstack_ff		= 0; 
 
 gboolean GVFS_qstack_initialized()
 {
@@ -445,6 +501,14 @@ void GVFS_async_cancel_all()
 	GVFS_qstack_ff = GVFS_qstack_size - 1;
 }
 
+//  ###########################################################################
+//  ###																		###
+//  ##																		 ##
+//  #					Gnome VFS - Async ops							      #
+//  ##																		 ##
+//  ###																		###
+//  ###########################################################################
+
 //=============================================================================
 //  Base structs for vfs async ops
 //=============================================================================
@@ -471,8 +535,8 @@ void* gvfs_async_load_subdirs::operator new(size_t size, GnomeVFSURI* parent_uri
 	//guint			element_size,
 	//guint			reserved_size);		growness
 	ls->array() = g_array_sized_new(
-		FALSE,
-		TRUE,
+		FALSE, 
+		TRUE, 
 		sizeof(gvfs_file*),
 		10);
 	ls->len()   = 0;
@@ -510,7 +574,7 @@ void gvfs_async_load_subdirs ::operator delete (void *p)
 //.............................................................................
 // Add entries...goto is the best
 //.............................................................................
-static void
+static void 
 GVFS_async_load_subdirectories_callback(
 	GnomeVFSAsyncHandle		*handle,
 	GnomeVFSResult			result,
@@ -538,7 +602,7 @@ GVFS_async_load_subdirectories_callback(
 	ALSC_INF("alsc:[%03i] entries:%03i list:%16x parent:[%s]%s", ga->hi(), entries_read, list, ls->ppath(), ls->puri()->text);
 
 	// counter
-	count   = 0;
+	count   = 0;						
 
 	// handle the '0-entry-case'
 	if ( entries_read == 0 )
@@ -548,7 +612,7 @@ GVFS_async_load_subdirectories_callback(
 
 	// init loop - we have at least one entry
 	l = g_list_first(list);
-
+	
 lab_loop:
 
 	count++;
@@ -572,14 +636,14 @@ lab_loop:
 			ALSC_WNG("alsc:[%03i][0x%16x] [%03i][%03i][%03i] [broken link, ignored]<%s>", ga->hi(), l, count, added, ga->mr(), info->name);
 			break;
 		}
-
+	
 		added++;
-
+		
 		ALSC_INF("alsc:[%03i][0x%16x] [%03i][%03i][%03i] S<%s>", ga->hi(), l, count, added, ga->mr(), info->name);
 
-		lnk = new(g_strdup(info->name), info->permissions, info->flags ) gvfs_symlink;
+		lnk = new() gvfs_symlink(g_strdup(info->name), info->permissions, info->flags );
 		ls->append( (gvfs_file*)lnk );
-
+		
 		// if the caller want partial listing
 		if  (
 				( ga->mr()  >= 0		)  &&
@@ -591,16 +655,18 @@ lab_loop:
 
 		//.....................................................................
 		case GNOME_VFS_FILE_TYPE_DIRECTORY :
-
+			
 		if  ( GVFS_vfsinfo_is_true_directory(info) )
 		{
 			added++;
 
 			ALSC_INF("alsc:[%03i][0x%16x] [%03i][%03i][%03i] +<%s>", ga->hi(), l, count, added, ga->mr(), info->name);
 
-			dir = new(g_strdup(info->name), info->permissions, info->flags ) gvfs_dir;
-			ls->append( (gvfs_file*)dir );
+			//dir = new(g_strdup(info->name), info->permissions, info->flags);// gvfs_dir;
+			dir = new() gvfs_dir(g_strdup(info->name), info->permissions, info->flags);
 
+			ls->append( (gvfs_file*)dir );
+			
 			// if the caller want partial listing
 			if  (
 					( ga->mr()  >= 0		)  &&
@@ -614,16 +680,16 @@ lab_loop:
 		default:
 		ALSC_INF("alsc:[%03i][0x%16x] [%03i][%03i][%03i]  <%s>", ga->hi(), l, count, added, ga->mr(), info->name);
 	}
-
+	
 	// if gvfs bugs on entries_read, we bug too with this
-	if ( count == entries_read )
+	if ( count == entries_read )		
 		goto lab_no_more_entry;
 
 	l = g_list_next(l);
 
 	goto lab_loop;
 
-//.............................................................................
+//.............................................................................	
 lab_no_more_entry:
 
 	// if OK, simply return, we will be re-called for further entries
@@ -640,10 +706,10 @@ lab_no_more_entry:
 	// else an error as occured : result is not OK, neither EOF.
 	// this occurs for example with symlinks, or access-denied directories ;
 	// show a little warning, and do as EOF, since there is no more entry.
-	ALSC_INF("alsc:[%03i][0x%16x]  (NO ENTRY - Jumping to EOF):%s",
+	ALSC_INF("alsc:[%03i][0x%16x]  (NO ENTRY - Jumping to EOF):%s", 
 		ga->hi(), l, gnome_vfs_result_to_string(result));
-
-//.............................................................................
+	
+//.............................................................................	
 lab_eof:
 
 	ALSC_INF("alsc:[%03i][0x%16x] (EOF)", ga->hi(), l);
@@ -662,7 +728,7 @@ lab_eof:
 	// "Final end"
 	return;
 
-//.............................................................................
+//.............................................................................	
 lab_abort:
 
 	ALSC_INF("alsc:[%03i][0x%16x] (ABORT)", ga->hi(), l);
@@ -725,7 +791,7 @@ void GVFS_async_load_subdirectories(
 			),
 		GVFS_ITEMS_PER_NOTIFICATION,
 		//GNOME_VFS_PRIORITY_DEFAULT,
-		GNOME_VFS_PRIORITY_MIN,
+		GNOME_VFS_PRIORITY_MIN,  
 		GVFS_async_load_subdirectories_callback,
 		(gpointer)ga);
 }
diff --git a/src/gnome-cmd-foldview-gvfs.h b/src/gnome-cmd-foldview-gvfs.h
index a8fcd4e..402dc47 100644
--- a/src/gnome-cmd-foldview-gvfs.h
+++ b/src/gnome-cmd-foldview-gvfs.h
@@ -61,7 +61,7 @@ void gwr_gvfs_err(const char* fmt, ...);
 						|						+-------------- gvfs_async_user_callback
 						|						|
 						|						+-------------- user_data
-						|
+						|						
 						+-------------------------------------- gvfs_async_load_subdirs
 
 */
@@ -81,58 +81,22 @@ struct gvfs_file
 	public:
 	gchar*&							name()			{ return d_name;	}
 	GcmdGtkFoldview::eFileAccess&	access()		{ return a_access;  }
-
+	
 	gboolean						flagged_symlink()   { return  ( (a_vfsflags & GNOME_VFS_FILE_FLAGS_SYMLINK) != 0	);	}
 	gboolean						is_symlink()		{ return ( a_vfstype == GNOME_VFS_FILE_TYPE_SYMBOLIC_LINK		);  }
 	gboolean						is_dir()			{ return ( a_vfstype == GNOME_VFS_FILE_TYPE_DIRECTORY			);  }
 
 
-	protected:
-	void		up(gchar *name, GnomeVFSResult result, GnomeVFSFilePermissions permissions, GnomeVFSFileType type, GnomeVFSFileFlags flags)
-				{
-					d_name			= name;
-
-					a_vfsresult		= result;
-					a_vfstype		= type;
-					a_vfsflags		= flags;
-
-					a_access		= GcmdGtkFoldview::Access_from_permissions(permissions);
-				}
-	void		down()
-				{
-					g_free(d_name);
-				}
+	public:
+				gvfs_file(gchar *name, GnomeVFSResult result, GnomeVFSFilePermissions permissions, GnomeVFSFileType type, GnomeVFSFileFlags flags);
+	virtual		~gvfs_file() = 0;	// forbid instantiation
 };
 
 struct gvfs_dir : gvfs_file
 {
-	private:
-	void		up(gchar *name, GnomeVFSFilePermissions permissions, GnomeVFSFileFlags flags)
-				{
-					gvfs_file::up(name, GNOME_VFS_OK, permissions, GNOME_VFS_FILE_TYPE_DIRECTORY, flags);
-
-					//content()		=   GcmdGtkFoldview::eContentInit;
-
-				}
-	void		down()
-				{
-					gvfs_file::down();
-				}
-
 	public:
-	void*		operator new	(size_t size, gchar *name, GnomeVFSFilePermissions permissions, GnomeVFSFileFlags flags)
-				{
-					gvfs_dir	*dir	= g_try_new0(gvfs_dir, 1);
-
-					dir->up(name, permissions, flags);
-
-					return (gvfs_file*)dir;
-				}
-	void		operator delete (void *p)
-				{
-					((gvfs_dir*)p)->down();
-					g_free (p);
-				}
+				gvfs_dir(gchar *name, GnomeVFSFilePermissions permissions, GnomeVFSFileFlags flags);
+				~gvfs_dir();
 };
 
 struct gvfs_symlink : gvfs_file
@@ -140,41 +104,20 @@ struct gvfs_symlink : gvfs_file
 	private:
 	GArray		*d_array;
 	guint		a_array_card;
-
+	
 	public:
 	void		append(gvfs_symlink* link)
 				{
-
+					
 				}
 	private:
 	gvfs_file   *d_target;
 	public:
 	gvfs_file*& target()	{ return d_target; }
 
-	private:
-	void		up(gchar *name, GnomeVFSFilePermissions permissions, GnomeVFSFileFlags flags)
-				{
-					gvfs_file::up(name, GNOME_VFS_OK, permissions, GNOME_VFS_FILE_TYPE_SYMBOLIC_LINK, flags);
-				}
-	void		down()
-				{
-					gvfs_file::down();
-				}
-
 	public:
-	void*		operator new	(size_t size, gchar *name, GnomeVFSFilePermissions permissions, GnomeVFSFileFlags flags)
-				{
-					gvfs_symlink	*lnk	= g_try_new0(gvfs_symlink, 1);
-
-					lnk->up(name, permissions, flags);
-
-					return (gvfs_file*)lnk;
-				}
-	void		operator delete (void *p)
-				{
-					( (gvfs_symlink*)p )->down();
-					g_free (p);
-				}
+				gvfs_symlink(gchar *name, GnomeVFSFilePermissions permissions, GnomeVFSFileFlags flags);
+				~gvfs_symlink();
 };
 //=============================================================================
 //  Async "core" structs
@@ -207,7 +150,7 @@ struct gvfs_async
 	gpointer&					ad()		{ return a_async_data;		}
 
 	public:
-	void*		operator new	(size_t size, gint32 handle_index, gint max_result, gvfs_async_caller_data* caller_data)
+	void*		operator new	(size_t size, gint32 handle_index, gint max_result, gvfs_async_caller_data* caller_data)   
 				{
 					gvfs_async	*ga	= g_try_new0(gvfs_async, 1);
 
@@ -216,7 +159,7 @@ struct gvfs_async
 						gwr_err("gvfs_async::new:g_try_new0 failed");
 						return ga;
 					}
-
+					
 					// no up & down function, since we have no inheritance
 					// for this struct
 					ga->a_handle_index	= handle_index;
@@ -226,14 +169,14 @@ struct gvfs_async
 					return ga;
 				}
 
-	void		operator delete (void *p)
-				{
-					g_free (p);
+	void		operator delete (void *p)		
+				{  
+					g_free (p);						
 				}
 };
 
 //-----------------------------------------------------------------------------
-//  Caller part :
+//  Caller part : 
 //  * gvfs_async_callback
 //  * struct gvfs_async_caller_data
 //-----------------------------------------------------------------------------
@@ -245,7 +188,7 @@ struct  gvfs_async_caller_data
 	gpointer					a_user_data;
 
 	public:
-	void*		operator new	(size_t size, gvfs_async_user_callback callback, gpointer p)
+	void*		operator new	(size_t size, gvfs_async_user_callback callback, gpointer p)   
 				{
 					gvfs_async_caller_data	*cd	= g_try_new0(gvfs_async_caller_data, 1);
 
@@ -254,16 +197,16 @@ struct  gvfs_async_caller_data
 						gwr_err("gvfs_async_caller_data::new:g_try_new0 failed");
 						return cd;
 					}
-
+					
 					cd->a_callback		= callback;
 					cd->a_user_data		= p;
 
 					return cd;
 				}
 
-	void		operator delete (void *p)
-				{
-					g_free (p);
+	void		operator delete (void *p)		
+				{  
+					g_free (p);						
 				}
 };
 
@@ -294,7 +237,7 @@ struct gvfs_async_load_subdirs
 	gint		a_array_card;
 	public:
 	GArray*&							array()			{ return m_array;		}
-	gint&								len()			{ return a_array_card;	}
+	gint&								len()			{ return a_array_card;	} 
 
 	gvfs_file*	element(gint i)	{ return g_array_index(m_array, gvfs_file*, i);	}
 
@@ -304,10 +247,10 @@ struct gvfs_async_load_subdirs
 				g_array_append_val(m_array, file);
 				a_array_card++;
 			}
-
+			
 	public:
-	void*		operator new	(size_t size, GnomeVFSURI* parent_uri, gchar *parent_path) ;
-	void		operator delete (void *p);
+	void*		operator new	(size_t size, GnomeVFSURI* parent_uri, gchar *parent_path) ; 
+	void		operator delete (void *p);		
 };
 
 
diff --git a/src/gnome-cmd-foldview-model.cc b/src/gnome-cmd-foldview-model.cc
index f3af2a3..897479e 100644
--- a/src/gnome-cmd-foldview-model.cc
+++ b/src/gnome-cmd-foldview-model.cc
@@ -53,15 +53,45 @@
 //  *								Defines								      *
 //  *																		  *
 //  ***************************************************************************
-GtkTreeIter GcmdGtkFoldview::Model::s_iter_NULL = { 0,0,0,0 };
+GtkTreeIter GcmdGtkFoldview::Model::Iter_zero = { 0,0,0,0 };
 
-//  ***************************************************************************
-//  *																		  *
-//  *								Helpers								      *
-//  *																		  *
-//  ***************************************************************************
+//  ###########################################################################
+//  ###																		###
+//  ##																		 ##
+//  #					struct GcmdGtkFoldview::Rowlike						  #
+//  ##																		 ##
+//  ###																		###
+//  ###########################################################################
 
+GcmdGtkFoldview::Model::Rowlike::Rowlike(gchar *_utf8_name, gint _icon)
+{
+	d_utf8_name		= g_strdup( _utf8_name );
+	a_icon			= _icon;
+	
+	// collate key
+	glong l = g_utf8_strlen(d_utf8_name, -1);
+	d_utf8_collate_key = g_utf8_collate_key_for_filename(d_utf8_name, l);
+}
+GcmdGtkFoldview::Model::Rowlike::~Rowlike()
+{
+	g_free(d_utf8_name);
+}
 
+const   gchar*  
+GcmdGtkFoldview::Model::Rowlike::utf8_collate_key()
+{ 
+	return d_utf8_collate_key;	
+}
+const   gchar*	
+GcmdGtkFoldview::Model::Rowlike::utf8_name()
+{ 
+	return d_utf8_name;			
+}
+gint	
+GcmdGtkFoldview::Model::Rowlike::icon()
+{ 
+	return a_icon;				
+}
 
 
 
@@ -95,11 +125,18 @@ void GcmdGtkFoldview::Model::init_instance()
 
 gboolean GcmdGtkFoldview::Model::create()
 {
-	m_treestore = gtk_tree_store_new(2, G_TYPE_STRING, G_TYPE_INT);
+#ifdef __GTS__
 
+	m_treestore = gtk_tree_store_new(2, G_TYPE_STRING, G_TYPE_INT);
 	gtk_tree_sortable_set_sort_func( treesortable(), 0, GcmdGtkFoldview::Model::Compare, NULL, NULL);
 	gtk_tree_sortable_set_sort_column_id( treesortable(), 0, GTK_SORT_ASCENDING);
 
+#else
+
+	m_treestore = gnome_cmd_foldview_treestore_new();
+
+#endif
+
 	connection(get_home_con());
 
 	return TRUE;
@@ -115,7 +152,7 @@ GtkTreeIter* GcmdGtkFoldview::Model::Iter_new(GtkTreeIter* iter)
 {
 	GtkTreeIter *new_iter = g_new0(GtkTreeIter,1);
 
-	if ( iter != NULL )
+	if ( iter != NULL )	
 		*new_iter = *iter;
 
 	return new_iter;
@@ -125,80 +162,6 @@ void GcmdGtkFoldview::Model::Iter_del(GtkTreeIter* iter)
 	g_free(iter);
 }
 
-gboolean GcmdGtkFoldview::Model::iter_from_path(
-	GtkTreePath *path,
-	GtkTreeIter *iter)
-{
-	return gtk_tree_model_get_iter(
-		GcmdFoldview()->model.treemodel(),
-		iter,
-		path);
-}
-
-
-//=============================================================================
-//  given an iter, return a mallocated
-//  * GnomeVFSURI   representing the full path
-//  * gchar*		representing the iter string
-//  ( is GtkTreeModel sucking ??? )
-//=============================================================================
-GnomeVFSURI* GcmdGtkFoldview::Model::iter_get_uri_new(GtkTreeIter *final)
-{
-	GtkTreePath *path   = NULL;
-	GnomeVFSURI *uri	= NULL;
-	GtkTreeIter iter;
-	gchar		strUri  [1024];
-	gchar*		strTemp;
-
-	strcpy(strUri,"");
-
-	// get the path from iter
-	path	=   gtk_tree_model_get_path( treemodel(), final );
-
-	while ( gtk_tree_path_get_depth(path) >= 1 )
-	{
-		if ( gtk_tree_model_get_iter( treemodel(), &iter, path) )
-		{
-			gtk_tree_model_get(treemodel(), &iter, 0, &strTemp, -1);
-			//gwr_inf("temp:%s", strTemp);
-			g_strreverse(strTemp);
-			g_strlcat(strUri, strTemp, 1024);
-			g_strlcat(strUri, "/", 1024);
-			g_free(strTemp);
-		}
-		gtk_tree_path_up(path);
-	}
-
-
-	// free the path
-	gtk_tree_path_free(path);
-
-	// reverse
-	g_strreverse(strUri);
-	//gwr_inf("uri_from_iter:%s", strUri);
-
-	// new uri
-	uri = GVFS_uri_new(strUri);
-	return uri;
-}
-
-gchar* GcmdGtkFoldview::Model::iter_get_string_new(GtkTreeIter *iter)
-{
-	gchar*		strTemp;
-
-	gtk_tree_model_get(treemodel(), iter, 0, &strTemp, -1);
-
-	return strTemp;
-}
-
-
-
-
-
-
-
-
-
 
 
 
@@ -265,7 +228,7 @@ void	GcmdGtkFoldview::Model::Root::unset()
 		gwr_inf("model_root::unset:info is null, destroying nothing");
 	}
 
-	m_uri		= NULL;
+	m_uri		= NULL; 
 	m_info		= NULL;
 }
 
@@ -289,7 +252,7 @@ gint GcmdGtkFoldview::Model::Compare(
 	if ( str_a[0] == '.' )  a_dotted = TRUE;
 	if ( str_b[0] == '.' )  b_dotted = TRUE;
 
-	if ( a_dotted && !b_dotted )
+	if ( a_dotted && !b_dotted ) 
 	{
 		g_free(str_a);
 		g_free(str_b);
@@ -309,9 +272,154 @@ gint GcmdGtkFoldview::Model::Compare(
 	return res;
 }
 
+//=============================================================================
+//  given an iter, return a mallocated 
+//  * GnomeVFSURI   representing the full path
+//  * gchar*		representing the iter string
+//  ( is GtkTreeModel sucking ??? )
+//=============================================================================
+GnomeVFSURI* GcmdGtkFoldview::Model::iter_get_uri_new(GtkTreeIter *final)
+{
+	GtkTreePath *path   = NULL;
+	GnomeVFSURI *uri	= NULL;
+	GtkTreeIter iter;
+	gchar		strUri  [1024];
+	gchar*		strTemp;
+
+	strcpy(strUri,"");
+
+#ifdef __GTS__
+
+	// get the path from iter
+	path	=   gtk_tree_model_get_path( treemodel(), final );
 
+	while ( gtk_tree_path_get_depth(path) >= 1 )
+	{
+		if ( gtk_tree_model_get_iter( treemodel(), &iter, path) )
+		{
+			gtk_tree_model_get(treemodel(), &iter, 0, &strTemp, -1);
+			//gwr_inf("Model::iter_get_uri_new:temp:%s", strTemp);
+			g_strreverse(strTemp);
+			g_strlcat(strUri, strTemp, 1024);
+			g_strlcat(strUri, "/", 1024);
+			g_free(strTemp);
+		}
+		gtk_tree_path_up(path);
+	}
 
 
+	// free the path
+	gtk_tree_path_free(path);
+
+	// reverse
+	g_strreverse(strUri);
+	//gwr_inf("uri_from_iter:%s", strUri);
+
+	// new uri
+	uri = GVFS_uri_new(strUri);
+	return uri;
+
+#else
+
+	// get the path from iter
+	path	=   GnomeCmdFoldviewTreestore::get_path( treemodel(), final );
+
+	while ( gtk_tree_path_get_depth(path) >= 1 )
+	{
+		if ( GnomeCmdFoldviewTreestore::get_iter( treemodel(), &iter, path) )
+		{
+				GValue v = {0};
+				GnomeCmdFoldviewTreestore::get_value(treemodel(), &iter, 0, &v);
+				Rowlike *r = (Rowlike*)g_value_get_pointer(&v);
+				strTemp = g_strdup(r->utf8_name());
+
+			//gwr_inf("Model::iter_get_uri_new:temp:%s", strTemp);
+			g_strreverse(strTemp);
+			g_strlcat(strUri, strTemp, 1024);
+			g_strlcat(strUri, "/", 1024);
+			g_free(strTemp);
+		}
+		gtk_tree_path_up(path);
+	}
+
+
+	// free the path
+	gtk_tree_path_free(path);
+
+	// reverse
+	g_strreverse(strUri);
+	//gwr_inf("Model::uri_from_iter:%s", strUri);
+
+	// new uri
+	uri = GVFS_uri_new(strUri);
+	return uri;
+	
+#endif
+}
+
+gchar* GcmdGtkFoldview::Model::iter_get_string_new(GtkTreeIter *iter)
+{
+	gchar*		str			= NULL;
+
+	GValue v = {0};
+	gtk_tree_model_get_value(treemodel(), iter, 0, &v);
+
+#ifdef __GTS__
+
+	const gchar* str_const = g_value_get_string(&v);
+	str = (char*)str_const;
+
+#else
+
+	Rowlike *r = (Rowlike*)g_value_get_pointer(&v);
+	str = g_strdup( r->utf8_name() );
+
+#endif
+	
+	return str;
+}
+
+/*
+#ifdef __GTS__
+
+	gtk_tree_model_get(treemodel(), iter, 0, &str_const, -1);
+
+#else
+
+	GValue v = {0};
+	gtk_tree_model_get_value(treemodel(), iter, 0, &v);
+	str_const = g_value_get_string(&v);
+	
+#endif
+
+	str = (char*)str_const;
+	return str;
+}
+*/
+//=============================================================================
+//  get_iter
+//=============================================================================
+gboolean GcmdGtkFoldview::Model::get_iter(
+	GtkTreePath *path,
+	GtkTreeIter *iter)
+{
+#ifdef __GTS__
+
+	return gtk_tree_model_get_iter(
+		treemodel(),
+		iter,
+		path);
+
+#else
+
+	return GnomeCmdFoldviewTreestore::get_iter(
+		treemodel(),
+		iter,
+		path);
+
+#endif
+}
+
 //=============================================================================
 //  subfolders of an item
 //=============================================================================
@@ -319,55 +427,74 @@ gboolean GcmdGtkFoldview::Model::iter_add_child(
 	GtkTreeIter						*parent,
 	GtkTreeIter						*child,
 	const gchar						*name,
-	gint							access)
+	gint							icon)
 {
-	gtk_tree_store_append( treestore(), child, parent );
-	gtk_tree_store_set( treestore(), child, 0, name, 1, access, -1 );
-
-	/*
-	GtkTreePath *path = gtk_tree_model_get_path(treemodel(), child);
+#ifdef __GTS__
 
-	GtkTreeRowReference *row_ref = gtk_tree_row_reference_new(treemodel(),path);
+	gtk_tree_store_append( treestore(), child, parent );
+	gtk_tree_store_set( treestore(), child, 0, name, 1, icon, -1 );
 
-	row_blob_new(row_ref, NULL);
+#else
 
-	gwr_inf("--- blob list ---");
-	GList *list = g_list_first(d_blob_list);
-	while ( list )
-	{
-		gwr_inf("blob [0x%08x]", list->data);
+	Rowlike* r = new Rowlike((gchar*)name, icon);
+	treestore()->add_child(parent, child, r);
 
-		list = g_list_next(list);
-	}
-	*/
+#endif
 	return TRUE;
 }
 
 //=============================================================================
 //  set value for iter
 //=============================================================================
-void GcmdGtkFoldview::Model::iter_set(GtkTreeIter *iter, gchar* text, gint access)
+void GcmdGtkFoldview::Model::set_value(GtkTreeIter *iter, gchar* text, gint icon)
 {
-	gtk_tree_store_set( treestore(), iter, 0, text, 1, access, -1);
+#ifdef __GTS__
+
+	gtk_tree_store_set( treestore(), iter, 0, text, 1, icon, -1);
+
+#else
+
+	
+	Rowlike* r = new Rowlike(text, icon);
+
+	GValue v = {0};
+	g_value_init(&v, G_TYPE_POINTER);
+	g_value_set_pointer(&v, r);
+
+	treestore()->set_value(iter, 0, &v);
+
+#endif
 }
 
 //=============================================================================
 //  set value for first child -> control
 //=============================================================================
 void GcmdGtkFoldview::Model::iter_replace_first_child(
-	GtkTreeIter				*parent,
-	GtkTreeIter				*child,
-	gchar*					text,
-	gint					access)
+	GtkTreeIter				*parent, 
+	GtkTreeIter				*child, 
+	gchar*					text, 
+	gint					icon)
 {
+#ifdef __GTS__
+
 	if ( !gtk_tree_model_iter_children( treemodel(), child, parent) )
 	{
-		gwr_err("iter_replace_first_child:could not get first child");
+		gwr_err("Model:iter_replace_first_child:could not get first child");
 		return;
 	}
 
+#else
+
+	if ( !GnomeCmdFoldviewTreestore::iter_children(treemodel(), child, parent) )
+	{
+		gwr_err("Model:iter_replace_first_child:could not get first child");
+		return;
+	}
+
+#endif
+
 	// set the value
-	iter_set( child, text, access);
+	set_value( child, text, icon);
 }
 
 //=============================================================================
@@ -377,19 +504,22 @@ void GcmdGtkFoldview::Model::iter_replace_first_child(
 //  we create the model_iter_set_first_child above just for fun.
 //=============================================================================
 void GcmdGtkFoldview::Model::iter_replace_dummy_child(
-	GtkTreeIter				*parent,
+	GtkTreeIter				*parent, 
 	GtkTreeIter				*child,
-	gchar*					text,
-	gint					access)
+	gchar*					text, 
+	gint					icon)
 {
-	gint		n		= iter_n_children(parent);
+	gint	n = 0;
+
+	n = iter_n_children(parent);
 
 	if ( n !=1 )
 	{
 		gwr_err("iter_replace_dummy_child:parent has %03i children", n);
 		return;
 	}
-	iter_replace_first_child(parent, child, text, access);
+
+	iter_replace_first_child(parent, child, text, icon);
 }
 
 //=============================================================================
@@ -397,7 +527,15 @@ void GcmdGtkFoldview::Model::iter_replace_dummy_child(
 //=============================================================================
 gint GcmdGtkFoldview::Model::iter_n_children(GtkTreeIter *parent)
 {
+#ifdef __GTS__
+
 	return gtk_tree_model_iter_n_children( treemodel(), parent );
+
+#else
+
+	return GnomeCmdFoldviewTreestore::iter_n_children(treemodel(), parent);
+
+#endif
 }
 
 
@@ -407,35 +545,62 @@ gint GcmdGtkFoldview::Model::iter_n_children(GtkTreeIter *parent)
 //  valid row at that level, or invalidated if it previously pointed
 //  to the last one.
 //=============================================================================
+/*
 gboolean GcmdGtkFoldview::Model::iter_remove(GtkTreeIter *iter)
 {
-	//gwr_inf("iter_remove");
+	gwr_inf("iter_remove");
+
+#ifdef __GTS__
 	return gtk_tree_store_remove( treestore(), iter);
+#else
+	gwr_inf("Model:iter_remove %04i", treestore()->remove(iter,TRUE));
+	return TRUE;
+#endif
 }
-
-
+*/
 //=============================================================================
 //  Remove all children of an iter
 //=============================================================================
 gint GcmdGtkFoldview::Model::iter_remove_children(GtkTreeIter *parent)
 {
+#ifdef __GTS__ 
+
 	gint				count   = 0;
 	//gchar				*str	= NULL;
 	GtkTreeIter			child;
 
+	//  Code with iter_remove, that is not recursive, but does not
+	//  return the number of nodes removed
+	//	
 	while ( gtk_tree_model_iter_children( treemodel(), &child, parent) )
 	{
-		//str = iter_get_string_new(&child);
-		//gwr_inf("Model::iter_remove_children:child %s", str);
-		//g_free(str);
-
-		count += iter_remove_children(&child);
-
-		iter_remove(&child);
-		count ++;
+		gtk_tree_store_remove(treestore(), &child);
 	}
 
+	//  Code with iter_remove, that returns the number of nodes removed
+	//  but is unuselessly recursive
+	//	
+	//	while ( gtk_tree_model_iter_children( treemodel(), &child, parent) )
+	//	{
+	//		//str = iter_get_string_new(&child);
+	//		//gwr_inf("Model::iter_remove_children:child %s", str);
+	//		//g_free(str);
+	//
+	//		count += iter_remove_children(&child);
+	//
+	//		iter_remove(&child);
+	//		count ++;
+	//	}
+	//
+
 	return count;
+
+#else
+
+	return treestore()->remove_children(parent);
+
+#endif
+
 }
 
 //=============================================================================
@@ -443,6 +608,13 @@ gint GcmdGtkFoldview::Model::iter_remove_children(GtkTreeIter *parent)
 //=============================================================================
 void GcmdGtkFoldview::Model::iter_remove_all()
 {
+#ifdef __GTS__
+
 	gtk_tree_store_clear(treestore());
-}
 
+#else
+
+	treestore()->clear();
+
+#endif
+}
diff --git a/src/gnome-cmd-foldview-private.h b/src/gnome-cmd-foldview-private.h
index 661ab79..ab24ca8 100644
--- a/src/gnome-cmd-foldview-private.h
+++ b/src/gnome-cmd-foldview-private.h
@@ -22,7 +22,7 @@
 #ifndef __GCMDGTKFOLDVIEW_PRIVATE_H__
 #define __GCMDGTKFOLDVIEW_PRIVATE_H__
 
-/******************************************************************************
+/******************************************************************************							
 
 	C++
 	Contain variadic macros
@@ -32,18 +32,18 @@
 
 		GcmdFileSelector resize automatically resize the main vertical pane
 		( FILL / EXPAND gtk settings somewhere ) ?
-
+		
 		memory leaks hunt
 
 		symlinks icons show little white pixel when selected its ugly
 		but gcmd's too
-
+			
 		init / destroy cleanup : g_object_ref on hided widgets
 
 		..................... facultative  / later ............................
 
 		sync file_list when it is not active ( in a hidden tab )
-
+			
 		Bookmarks
 
 		Notification from filesystem ( very hard to do, we're really going
@@ -51,13 +51,12 @@
 
 DONE	foldview correct position on show / hide ( cmdline, buttonbar, ... )
 
-DONE	(Finally) gcmd crashes when opening access-denied folder from treeview
+DONE	(Finally) gcmd crashes when opening access-denied folder from treeview 
 		in tab, after showing an alert
 
 DONE	Going crazy with correct theming of treeview with selectionned items,
 		focus between widgets,...
 
-
 DONE	combo connections at startup
 
 DONE	gtk_widget_set_sensitive on non-full-functional items of context menu
@@ -69,19 +68,19 @@ DONE	? mutex on handles : no, gvfs_async calls are queued
 		concurrency between gtk & gvfs
 
 DONE	why GVFS_qstack_ff / GVFS_qstack_size  is always n-2 / n ??? should be n / n
-		-> because t' affiches ff _avant_ update et qsize au lieu de qsize - 1,
+		-> because t' affiches ff _avant_ update et qsize au lieu de qsize - 1, 
 		stupid, ça fait un décalage de 2
 
 DONE	Comments cleanup
-
+	
 DONE	Private logging for gvfs ops
 
-DONE	Cancel all async ops
-
+DONE	Cancel all async ops 
+	
 DONE	Big Bug in checking type of GnomeVFSFileInfo : GNOME_VFS_FILE_TYPE_...
-		are distinct values - it is not a bitfield, triple fuck, spended time
+		are distinct values - it is not a bitfield, triple fuck, spended time 
 		on that
-
+	
 	---------------------------------------------------------------------------
 	TODO EPIOTR
 
@@ -119,7 +118,7 @@ DONE	* after opening foldview, cmdline is moved from bottom to top -
 
 
 
-*******************************************************************************
+*******************************************************************************							
 						HELPERS LOGGERS
 						===============
 
@@ -137,7 +136,7 @@ void gnome_cmd_file_log(gchar *str, GnomeCmdFile *file)
 {
 	gchar   temp[1024];
 
-	sprintf(temp, "fil:[0x%08x %3s][%03i-%03i] [h:xxxxxxxx] [mu:xxx] [%s] [%s]\n",
+	sprintf(temp, "fil:[0x%08x %3s][%03i-%03i] [h:xxxxxxxx] [mu:xxx] [%s] [%s]\n", 
 		file,
 		g_object_is_floating(file) ? "FLO" : "REF",
 		((GInitiallyUnowned*)file)->ref_count,
@@ -162,12 +161,12 @@ void gnome_cmd_dir_log(const gchar *str, GnomeCmdDir *dir)
 		return;
 	}
 
-	sprintf(temp, "dir:[0x%08x %3s][%03i-%03i] [h:0x%08x] [mu:xxx] [%s] [%s]\n",
+	sprintf(temp, "dir:[0x%08x %3s][%03i-%03i] [h:0x%08x] [mu:xxx] [%s] [%s]\n", 
 		dir,
 		g_object_is_floating(dir) ? "FLO" : "REF",
 		((GInitiallyUnowned*)dir)->ref_count,
 		gnome_cmd_file_get_ref_count(GNOME_CMD_FILE(dir)),
-		gnome_cmd_dir_get_handle(dir),
+		gnome_cmd_dir_get_handle(dir), 
 		//dir->priv->monitor_users,
 		GNOME_CMD_FILE_INFO(dir)->uri != NULL ? GNOME_CMD_FILE_INFO(dir)->uri->text : "no uri",
 		str);
@@ -287,7 +286,7 @@ void GnomeCmdFileList::set_directory(GnomeCmdDir *dir)
 
 
 
-*******************************************************************************
+*******************************************************************************							
 
 					WIDGET HIERARCHY FOR GTK-FOLDVIEW
 					=================================
@@ -306,7 +305,7 @@ void GnomeCmdFileList::set_directory(GnomeCmdDir *dir)
 		GtkWidget *info_label;
 
 
-*******************************************************************************
+*******************************************************************************							
 
 				WIDGET HIERARCHY FOR GNOME-CMD-FILE-SELECTOR
 				============================================
@@ -319,12 +318,12 @@ void GnomeCmdFileList::set_directory(GnomeCmdDir *dir)
 		+--------------------- GnomeCmdFileList
 
 
-*******************************************************************************
+*******************************************************************************							
 
 						GTK+ DRAG & DROP SYNOPSIS
 						=========================
 
-
+			
 		"drag-begin"									SRC
 
 		"drag-motion"												DST
@@ -341,25 +340,33 @@ void GnomeCmdFileList::set_directory(GnomeCmdDir *dir)
 			|
 		"drag-data-received"										DST
 			|
-			|
+			|									
 		"drag-end"										SRC
 
-
+	
 	+   "drag-failed"									SRC
 		"drag-data-delete"								SRC
-
+		
 ******************************************************************************/
+//#define USE_GTK_TREESTORE
+
+
 
 #include <glib.h>
 #include <glib-object.h>
 #include <gtk/gtkvbox.h>
 #include <gtk/gtklabel.h>
+#ifndef USE_GTK_TREESTORE
+	#include "gnome-cmd-foldview-treestore.h"
+#endif
 
-#define GCMDGTKFOLDVIEW_TYPE			(gcmdgtkfoldview_get_type ())
-#define GCMDGTKFOLDVIEW(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCMDGTKFOLDVIEW_TYPE, GcmdGtkFoldview))
-#define GCMDGTKFOLDVIEW_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GCMDGTKFOLDVIEW_TYPE, GcmdGtkFoldviewClass))
-#define IS_GCMDGTKFOLDVIEW(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCMDGTKFOLDVIEW_TYPE))
-#define IS_GCMDGTKFOLDVIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GCMDGTKFOLDVIEW_TYPE))
+//*****************************************************************************
+//								Defines
+//*****************************************************************************
+
+// undef this if you want foldview to use a GtkTreestore instead
+// of a GnomeCmdFoldviewTreestore
+//#define USE_GTK_TREESTORE
 
 //*****************************************************************************
 //								Logging
@@ -412,10 +419,18 @@ void gwr_err_vfs(const char* fmt, ...);
 	}																		\
 }
 
-
 //*****************************************************************************
 //							GcmdGtkFoldview
 //*****************************************************************************
+#define GCMDGTKFOLDVIEW_TYPE			(gcmdgtkfoldview_get_type ())
+#define GCMDGTKFOLDVIEW(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCMDGTKFOLDVIEW_TYPE, GcmdGtkFoldview))
+#define GCMDGTKFOLDVIEW_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GCMDGTKFOLDVIEW_TYPE, GcmdGtkFoldviewClass))
+#define IS_GCMDGTKFOLDVIEW(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCMDGTKFOLDVIEW_TYPE))
+#define IS_GCMDGTKFOLDVIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GCMDGTKFOLDVIEW_TYPE))
+
+#ifdef USE_GTK_TREESTORE
+	#define __GTS__
+#endif
 
 struct gvfs_async;
 struct gvfs_file;
@@ -441,14 +456,11 @@ struct GcmdGtkFoldview
 
 		eAccessInit			=   0xFE,
 		eAccessUnknown		=   0xFF
-
 	};
 
-
 	public:
 	static  eFileAccess Access_from_permissions		(GnomeVFSFilePermissions permissions);
 
-
 	//=========================================================================
 	//  View
 	//=========================================================================
@@ -457,8 +469,8 @@ struct GcmdGtkFoldview
 		// For fixing the moving gutter of the pane
 		gulong		a_size_request_handle;
 		gint		a_size_request_width;
-
-		// We have a m_parent member because of callbacks, for calling
+		
+		// We have a m_parent member because of callbacks, for calling 
 		// the controller
 		private:
 		GtkWidget   *a_this;
@@ -487,7 +499,7 @@ struct GcmdGtkFoldview
 		//---------------------------------------------------------------------
 		private:
 		GdkPixbuf		*m_pixbuf[50];
-
+	
 		public:
 		enum eIcon
 		{
@@ -501,7 +513,7 @@ struct GcmdGtkFoldview
 			eIconSymlinkToDirReadOnly		,
 			eIconSymlinkToDirForbidden
 		};
-
+		
 		private:
 		gboolean		icons_load();
 		void			icons_unload();
@@ -537,10 +549,10 @@ struct GcmdGtkFoldview
 
 		private:
 		GtkTreeSelection	*selection()		{ return gtk_tree_view_get_selection(treeview()); }
-		gint				selection_count()
+		gint				selection_count()	
 							{
 								// Note: gtk_tree_selection_count_selected_rows() does not
-								//   exist in gtk+-2.0, only in gtk+ >= v2.2 !
+								//   exist in gtk+-2.0, only in gtk+ >= v2.2 ! 
  								return 	gtk_tree_selection_count_selected_rows(selection());
 							}
 
@@ -554,7 +566,7 @@ struct GcmdGtkFoldview
 		static 	void		signal_row_collapsed(GtkTreeView *tree_view,
 			GtkTreeIter		*iter, GtkTreePath *path,gpointer user_data);
 
-		static  gboolean	signal_button_press_event(GtkWidget *tree_view,
+		static  gboolean	signal_button_press_event(GtkWidget *tree_view, 
 							GdkEventButton *event, gpointer user_data);
 
 		static 	void		signal_drag_begin(GtkWidget *widget,
@@ -588,7 +600,7 @@ struct GcmdGtkFoldview
 										gtk_tree_path_free(d_path_clicked);
 									}
 								}
-
+			   
 			void	*operator   new(size_t size)	{  return g_new0(ctx_menu_data, 1);  }
 			void	operator	delete(void *p)		{  g_free(p);  }
 		};
@@ -597,7 +609,7 @@ struct GcmdGtkFoldview
 		{
 			gboolean	a_connect;
 			gchar		*a_text;
-			GCallback   a_callback;
+			GCallback   a_callback;				
 		};
 		struct  ctx_menu_entry
 		{
@@ -629,7 +641,7 @@ struct GcmdGtkFoldview
 		//---------------------------------------------------------------------
 		public:
 		void	update_style();
-
+		
 	} view;
 	//=========================================================================
 	//  Model
@@ -647,11 +659,13 @@ struct GcmdGtkFoldview
 		// divers
 		//---------------------------------------------------------------------
 		public:
-		static GtkTreeIter s_iter_NULL;
+		static GtkTreeIter Iter_zero;
 
 		//---------------------------------------------------------------------
-		// gtk treestore
+		// treestore
 		//---------------------------------------------------------------------
+#ifdef __GTS__							// With GtkTreeStore
+
 		private:
 		GtkTreeStore	*m_treestore;
 		public:
@@ -659,59 +673,77 @@ struct GcmdGtkFoldview
 		GtkTreeModel	*treemodel()	{ return GTK_TREE_MODEL(m_treestore);	}
 		GtkTreeSortable	*treesortable()	{ return GTK_TREE_SORTABLE(m_treestore);}
 
+#else								   // With GnomeCmdFoldviewTreestore
+
+		private:
+		GnomeCmdFoldviewTreestore	   *m_treestore;
+		public:
+		GnomeCmdFoldviewTreestore		*treestore()	{ return m_treestore;	}
+		GtkTreeModel	*treemodel()	{ return GTK_TREE_MODEL(m_treestore);	}
+		GtkTreeSortable	*treesortable()	{ return GTK_TREE_SORTABLE(m_treestore);}
+
+		//
+		//  Instead of storing boring G_TYPES vars in the store, we can store 
+		//  anything that inherits from GnomeCmdFoldviewTreestore::Data
+		//  when using GnomeCmdFoldviewTreestore :)
+		//
+		public:
+		struct Rowlike : GnomeCmdFoldviewTreestore::Data
+		{
+			private:
+			gchar   *d_utf8_name;
+			gchar   *d_utf8_collate_key;
+			gint	a_icon;
+			//.................................................................
+			public:
+			Rowlike(gchar *_utf8_name, gint _icon);
+			~Rowlike();
+			//.................................................................
+			public:	
+			const   gchar*  utf8_collate_key();
+			const   gchar*	utf8_name();
+					gint	icon();
+		};
+
+#endif
+		
+		// Treemodel methods. These methods use either
+		// GtkTreestore or CnomeCmdFoldviewTreestore, depending on the 
+		// #define __GTS__ above.
+
+		//
+		// Methods from GtkTreeModelIface
+		//
+		gboolean		get_iter(GtkTreePath *path /*in*/, GtkTreeIter *iter /*out*/);
+		gint			iter_n_children (GtkTreeIter *parent);
+		//
+		// Custom methods
+		//
 		private:
 		static  gint			Compare(GtkTreeModel*, GtkTreeIter*, GtkTreeIter* , gpointer);
 		public:
 		static  GtkTreeIter*	Iter_new(GtkTreeIter*);
 		static  void			Iter_del(GtkTreeIter*);
 
-		gboolean		iter_from_path		(GtkTreePath *path /*in*/, GtkTreeIter *iter /*out*/);
 		GnomeVFSURI*	iter_get_uri_new	(GtkTreeIter *iter);
 		gchar*			iter_get_string_new (GtkTreeIter *iter);
 
-		void			iter_set(GtkTreeIter*, gchar*, gint access);
-		void			iter_replace_first_child(GtkTreeIter *parent, GtkTreeIter *child, gchar *name, gint access);
-		void			iter_replace_dummy_child(GtkTreeIter *parent, GtkTreeIter *child, gchar *name, gint access);
-		gboolean		iter_add_child(GtkTreeIter* parent /*in*/, GtkTreeIter *child /*out*/, const gchar *name, gint access);
+		void			set_value(GtkTreeIter*, gchar*, gint icon);
 
-		gint			iter_n_children(GtkTreeIter *parent);
-		gboolean		iter_remove(GtkTreeIter *iter);
+		void			iter_replace_first_child(GtkTreeIter *parent, GtkTreeIter *child, gchar *name, gint icon);
+		void			iter_replace_dummy_child(GtkTreeIter *parent, GtkTreeIter *child, gchar *name, gint icon);
+
+		gboolean		iter_add_child  (GtkTreeIter* parent /*in*/, GtkTreeIter *child /*out*/, const gchar *name, gint icon);
+
+		//gboolean		iter_remove(GtkTreeIter *iter);
 		void			iter_remove_all();
 
-		private:
-		gint			iter_remove_children_recurse(GtkTreeIter *parent);
-		public:
 		gint			iter_remove_children(GtkTreeIter *parent);
 
 		//---------------------------------------------------------------------
 		// store custom data in gtktreestore !
 		//---------------------------------------------------------------------
-		private:
-		struct row_blob
-		{
-			public:
-			GtkTreeRowReference		*d_row_ref;
-
-			gvfs_file				*d_file;
-
-		};
-		GList   *d_blob_list;
-
-		public:
-		//void			row_blob_remove_unvalids();
-		//row_blob*		row_blob_find(GtkTreeRowReference *row_ref);
-		void			row_blob_new(GtkTreeRowReference *row_ref, gvfs_file *file)
-		{
-			if ( !row_ref )
-				return;
 
-			row_blob	*rb = g_try_new0(row_blob,1);
-
-			rb->d_row_ref = row_ref;
-			rb->d_file	  = NULL;
-
-			d_blob_list = g_list_append(d_blob_list, (gpointer)rb);
-		}
 		//---------------------------------------------------------------------
 		// root element ( because of samba possibility )
 		//---------------------------------------------------------------------
@@ -730,13 +762,13 @@ struct GcmdGtkFoldview
 		//---------------------------------------------------------------------
 		private:
 		GnomeCmdCon		*m_con;
-
-		public:
+		
+		public:					
 		void			connection(GnomeCmdCon *con)	{ m_con = con;		}
 		GnomeCmdCon*	connection()					{ return m_con;		}
-
+		
 	} model;
-
+	
 	//=========================================================================
 	//  Controller
 	//=========================================================================
@@ -775,7 +807,7 @@ struct GcmdGtkFoldview
 			void		control_iter_expand_p(GnomeVFSURI *parent_uri, gchar *parent_path);
 	public:
 			void		control_iter_expand(GtkTreeIter *parent);
-
+	
 	//-------------------------------------------------------------------------
 	// context menu actions
 	//-------------------------------------------------------------------------
@@ -787,7 +819,7 @@ struct GcmdGtkFoldview
 	static  void		Control_set_active_tab	(GtkMenuItem*, View::ctx_menu_data*);
 	static  void		Control_open_new_tab	(GtkMenuItem*, View::ctx_menu_data*);
 	static  void		Control_set_new_root	(GtkMenuItem*, View::ctx_menu_data*);
-
+	
 	private:
 	enum eSyncState
 	{
diff --git a/src/gnome-cmd-foldview-treestore.cc b/src/gnome-cmd-foldview-treestore.cc
new file mode 100644
index 0000000..8650440
--- /dev/null
+++ b/src/gnome-cmd-foldview-treestore.cc
@@ -0,0 +1,1483 @@
+#include <string.h>
+#include "gnome-cmd-foldview-treestore.h"
+ 
+//  ###########################################################################
+//  ###																		###
+//  ##																		 ##
+//  #								LOGGER									  #
+//  ##																		 ##
+//  ###																		###
+//  ###########################################################################
+
+void gwr_inf(const char* fmt, ...);
+void gwr_wng(const char* fmt, ...);
+void gwr_err(const char* fmt, ...);
+
+//#define DEBUG_STORE
+//#define DEBUG_NODES
+//#define DEBUG_BLOCKS
+
+
+// Logging for GnomeCmdFoldviewTreestore
+#ifdef DEBUG_STORE
+
+	#define STORE_INF(...)													\
+	{																		\
+		gwr_inf(__VA_ARGS__);												\
+	}
+	#define STORE_WNG(...)													\
+	{																		\
+		gwr_wng(__VA_ARGS__);												\
+	}
+	#define STORE_ERR(...)													\
+	{																		\
+		gwr_err( __VA_ARGS__);												\
+	}
+
+#else
+
+	#define STORE_INF(...)
+	#define STORE_WNG(...)
+	#define STORE_ERR(...)
+
+#endif
+
+// Logging for nodes
+#ifdef DEBUG_NODES
+
+	#define NODE_INF(...)													\
+	{																		\
+		gwr_inf(__VA_ARGS__);												\
+	}
+	#define NODE_WNG(...)													\
+	{																		\
+		gwr_wng(__VA_ARGS__);												\
+	}
+	#define NODE_ERR(...)													\
+	{																		\
+		gwr_err( __VA_ARGS__);												\
+	}
+
+#else
+
+	#define NODE_INF(...)
+	#define NODE_WNG(...)
+	#define NODE_ERR(...)
+
+#endif
+
+// Logging for blocks
+#ifdef DEBUG_BLOCKS
+
+	#define BLOCK_INF(...)													\
+	{																		\
+		gwr_inf(__VA_ARGS__);												\
+	}
+	#define BLOCK_WNG(...)													\
+	{																		\
+		gwr_wng(__VA_ARGS__);												\
+	}
+	#define BLOCK_ERR(...)													\
+	{																		\
+		gwr_err( __VA_ARGS__);												\
+	}
+
+#else
+
+	#define BLOCK_INF(...)
+	#define BLOCK_WNG(...)
+	#define BLOCK_ERR(...)
+
+#endif
+
+
+//  ###########################################################################
+//  ###																		###
+//  ##																		 ##
+//  #								DATA									  #
+//  ##																		 ##
+//  ###																		###
+//  ###########################################################################
+gint GnomeCmdFoldviewTreestore::Data::Count = 0;
+
+GnomeCmdFoldviewTreestore::Data::Data()
+{
+	GnomeCmdFoldviewTreestore::Data::Count++;
+	//STORE_INF("DAT(+ %04i)", Count);
+}
+
+GnomeCmdFoldviewTreestore::Data::~Data()
+{
+	Count--;
+	//STORE_INF("DAT(- %04i)", Count);
+}
+
+
+
+//  ###########################################################################
+//  ###																		###
+//  ##																		 ##
+//  #								NODES 							 	      #
+//  ##																		 ##
+//  ###																		###
+//  ###########################################################################
+
+gint GnomeCmdFoldviewTreestore::node::Count = 0;
+
+#define NODE_FROM_ITER(_node, _iter)										\
+	_node = (GnomeCmdFoldviewTreestore::node*)_iter->user_data
+
+#define ITER_FROM_NODE(_treestore, _iter, _node)							\
+	(_iter)->stamp		= _treestore->stamp();								\
+	(_iter)->user_data	= _node;											\
+	(_iter)->user_data2	= NULL;												\
+	(_iter)->user_data3	= _node->data();
+
+#define ITER_RESET(_iter)													\
+	(_iter)->stamp		= 0;												\
+	(_iter)->user_data	= NULL;												\
+	(_iter)->user_data2	= NULL;												\
+	(_iter)->user_data3	= NULL;
+	
+//=============================================================================
+
+  /**
+	*   GnomeCmdFoldviewTreestore::node::new:
+	*
+	*   @_depth  : Depth of the node ( = same as depth in GtkTreePath )
+	*   @_pos    : Pos ( starting from 0 ) of the node in the block
+	*			   it belongs to
+	*   @_parent : Parent node of this node
+	*   @_data   : User's data
+	*
+	**/
+
+//=============================================================================
+void*	GnomeCmdFoldviewTreestore::node::operator new(
+	size_t								size,
+	gint								_depth, // only for the new node_block
+	gint								_pos,
+	GnomeCmdFoldviewTreestore::node		*_parent,
+	GnomeCmdFoldviewTreestore::Data*	_data)
+{
+	GnomeCmdFoldviewTreestore::node	*n = g_try_new0(GnomeCmdFoldviewTreestore::node, 1);
+
+	if ( !n )
+		return n;
+
+	n->a_pos			= _pos;
+	n->a_parent			= _parent;
+	n->a_next			= NULL;
+
+	n->a_children		= new (_depth + 1, n) node_block;
+
+	n->d_data			= _data;
+
+	Count++;
+	NODE_INF("NOD(+%04i nodes) d:%03i p:%03i p:0x%08x,%03i", Count, _depth, _pos, _parent, _parent ? _parent->pos() : 0);
+
+	return n;
+}
+
+//=============================================================================
+
+  /**
+	*   GnomeCmdFoldviewTreestore::node::delete:
+	*
+	*   This function does _NOT_ free the GArray containing the children.
+	*   For recursive delete, use purge()
+	*
+	**/
+
+//=============================================================================
+void	
+GnomeCmdFoldviewTreestore::node::operator delete(
+void *p)
+{
+	GnomeCmdFoldviewTreestore::node	*n = (GnomeCmdFoldviewTreestore::node*)p;
+
+	#ifdef DEBUG_NODES
+	NODE_INF("NOD(-%04i nodes) p:%03i p:0x%08x,%03i", Count - 1, n->pos(), n->parent(), n->parent() ? n->parent()->pos() : 0);
+	#endif
+
+	delete n->data();
+
+	g_free(p);
+
+	Count--;
+}
+
+//=============================================================================
+
+  /**
+	*   GnomeCmdFoldviewTreestore::node::purge:
+	*
+	*   @node : the node of this block to remove
+	*
+	*   _RECURSIVELY_ remove the node and all its descendance. The GArray
+	*   containing the children of the node is deleted.
+	*
+	**/
+
+//=============================================================================
+gint
+GnomeCmdFoldviewTreestore::node::purge()
+{
+	gint									count   = 0;
+	//.........................................................................
+
+	count += children()->purge();
+	delete children();
+	return count;
+}
+
+//=============================================================================
+//
+//  node : Logging
+//
+//=============================================================================
+#ifdef DEBUG_NODES
+const gchar* GnomeCmdFoldviewTreestore::node::log()
+{
+	static gchar Node_str_01[1024];
+
+	//node : pos parent next children data
+	sprintf(Node_str_01, "dep:%03i pos:%03i nxt:%s chd:%03i dat:%s",
+		a_parent ? a_parent->children()->depth() : 1,
+		a_pos,
+		a_next ? "Y" : "N",
+		a_children->card(),
+		d_data ? "Y" : "N" );
+
+	return Node_str_01;
+}
+#else
+const gchar* GnomeCmdFoldviewTreestore::node::log()
+{
+	return "XXX";
+}
+#endif
+
+//  ###########################################################################
+//  ###																		###
+//  ##																		 ##
+//  #							 NODE BLOCKS								  #
+//  ##																		 ##
+//  ###																		###
+//  ###########################################################################
+gint GnomeCmdFoldviewTreestore::node_block::Count   = 0;
+
+//=============================================================================
+
+  /**
+	*   GnomeCmdFoldviewTreestore::node_block::new:
+	*
+	*   @_depth  : The depth of the block ( = same as depth in GtkTreePath )
+	*   @_parent : The parent node
+	*
+	**/
+
+//=============================================================================
+void*   GnomeCmdFoldviewTreestore::node_block::operator new(
+	size_t								size,
+	guint								_depth,
+	GnomeCmdFoldviewTreestore::node		*_parent)
+{
+	GnomeCmdFoldviewTreestore::node_block	*nb = g_try_new0(GnomeCmdFoldviewTreestore::node_block, 1);
+
+	if ( !nb )
+		return nb;
+
+	nb->a_card		= 0;
+	nb->a_depth		= _depth;
+	nb->a_parent	= _parent;
+
+	nb->d_nodes		= g_array_sized_new(
+		FALSE,					// zero_terminated element appended at the end
+		TRUE,					// all bits set to zero
+		sizeof(node*),			// element_size,
+		10);					//reserved_size);
+
+	// Fuck, Fuck, Fuck !!!
+	// Spended hours on this, g_array_sized_new( ...set bits to 0 )
+	// doesnt fucking work !!!
+	// printf("GArray 0x%08x d:%03i p:0x%08x [0]=0x%08x\n", nb->d_nodes, nb->a_depth, nb->a_parent, g_array_index(nb->d_nodes, GnomeCmdFoldviewTreestore::node*, 0));
+
+	Count++;
+	BLOCK_INF("BLK(+%04i blocks) d:%03i", Count, nb->a_depth);
+
+	return nb;
+}
+
+//=============================================================================
+
+  /**
+	*   GnomeCmdFoldviewTreestore::node_block::delete:
+	*
+	**/
+
+//=============================================================================
+void	GnomeCmdFoldviewTreestore::node_block::operator delete (void *p)
+{
+	#ifdef DEBUG_BLOCKS
+	GnomeCmdFoldviewTreestore::node_block *b = (GnomeCmdFoldviewTreestore::node_block*)p;
+	BLOCK_INF("BLK(+%04i blocks) d:%03i c:%03i", Count - 1, b->a_depth, b->a_card);
+	#endif
+
+	g_free(p);
+
+	Count--;
+}
+
+//=============================================================================
+
+  /**
+	*   GnomeCmdFoldviewTreestore::node_block::node_get:
+	*
+	*   @pos : Position ( starting from zero ) of the node to get.
+	*
+	**/
+
+//=============================================================================
+GnomeCmdFoldviewTreestore::node*
+GnomeCmdFoldviewTreestore::node_block::node_get(
+	gint pos)
+{
+	GnomeCmdFoldviewTreestore::node			*node   = NULL;
+	//.........................................................................
+	if ( a_card == 0 )
+	{
+		// gtk+ calls us with...
+		//g_return_val_if_fail( index == 0, NULL );
+		if ( pos != 0 )
+			return NULL;
+
+		BLOCK_INF("BLK(%-20s) d:%03i p:%03i c:%03i [NULL]", "node_get", a_depth, index, a_card);
+		// this is authorized, since gtk call us for 0th child !!!
+		return NULL;
+	}
+	else
+	{
+		// gtk+ calls us with bad indexes !!! ( when scrooling liftbars )
+		// g_return_val_if_fail( index < a_card, NULL );
+		if ( pos >= a_card )
+			return NULL;
+	}
+
+	node = g_array_index(d_nodes, GnomeCmdFoldviewTreestore::node*, pos);
+	BLOCK_INF("BLK(%-20s) d:%03i p:%03i c:%03i [%s]", "node_get", a_depth, pos, a_card, node->log());
+	return node;
+}
+
+//=============================================================================
+
+  /**
+	*   GnomeCmdFoldviewTreestore::node_block::node_append:
+	*
+	*   @data : user's data
+	*
+	*   Insert a node in the block. This method respect the ordering settings
+	*   of the store.
+	*
+	**/
+
+//=============================================================================
+GnomeCmdFoldviewTreestore::node*
+GnomeCmdFoldviewTreestore::node_block::node_append(
+GnomeCmdFoldviewTreestore::Data *data)
+{
+	GnomeCmdFoldviewTreestore::node *node   = NULL;
+	GnomeCmdFoldviewTreestore::node *temp   = NULL;
+	gint							i		= 0;
+	//.........................................................................
+
+	// create a new node with pos = 0 :
+	// we cant set the position now, because we dont know at which position
+	// we will be stored
+	node = new (a_depth, 0, a_parent, data) GnomeCmdFoldviewTreestore::node;
+
+	if ( !GnomeCmdFoldviewTreestore::Render_sort() )
+	{
+		goto generic_append;
+	}
+	else
+	{
+		if ( GnomeCmdFoldviewTreestore::Render_sort_ascending() )
+		{
+			// ascending - case NO
+			if ( !GnomeCmdFoldviewTreestore::Render_sort_case_sensitive() )
+			{
+				g_assert(FALSE);
+			}
+			//.................................................................
+			// ascending - case YES
+			else
+			{
+				temp = g_array_index(d_nodes, GnomeCmdFoldviewTreestore::node*, 0);
+loop_acy:
+				// Fuck, Fuck, Fuck !!!
+				// Spended hours on this, g_array_sized_new( ...set bits to 0 )
+				// doesnt fucking work !!!
+				//if ( !temp )
+				if ( i >= a_card )
+					goto generic_append;
+
+				g_assert( node->parent() == temp->parent() );
+
+				if ( strcmp( node->data()->utf8_collate_key(), temp->data()->utf8_collate_key() ) >= 0 )
+					goto generic_insert;
+
+				temp = temp->next(); i++;
+				goto loop_acy;
+			}
+		}
+		else
+		{
+			// descending - case NO
+			if ( !GnomeCmdFoldviewTreestore::Render_sort_case_sensitive() )
+			{
+				g_assert(FALSE);
+			}
+			//.................................................................
+			// descending - case YES
+			else
+			{
+				temp = g_array_index(d_nodes, GnomeCmdFoldviewTreestore::node*, 0);
+loop_dcy:
+				// Fuck, Fuck, Fuck !!!
+				// Spended hours on this, g_array_sized_new( ...set bits to 0 )
+				// doesnt fucking work !!!
+				//if ( !temp )
+				if ( i >= a_card )
+					goto generic_append;
+
+				g_assert( node->parent() == temp->parent() );
+
+				if ( strcmp( node->data()->utf8_collate_key(), temp->data()->utf8_collate_key() ) <= 0 )
+					goto generic_insert;
+
+				temp = temp->next(); i++;
+				goto loop_dcy;
+			}
+		}
+	}
+
+
+	//.........................................................................
+	//
+	// Generic back-end : We have to append 'node' at the end of the array
+	//
+	// append to the end of the array
+generic_append:
+	// Now we know our pos, it is a_card - 1 + 1 = a_card
+	node->a_pos = a_card;
+
+	// Note : I have never seen d_nodes change in append case
+	d_nodes = g_array_append_val(d_nodes, node);
+
+	// modify the previous node so its ->next field points to the newly 
+	// created node ; do that only if we didnt create the first node.
+	if ( a_card != 0 )
+	{
+		temp = g_array_index(d_nodes, GnomeCmdFoldviewTreestore::node*, a_card - 1);
+		g_assert( node->parent() == temp->parent() );
+		temp->a_next = node;
+	}
+
+	a_card++;
+	return node;
+
+	//.........................................................................
+	//
+	// Generic back-end : We have to insert 'node' at pos i, instead of 'temp'
+	//
+generic_insert:
+	// Now we know our pos, it is i
+	node->a_pos = i;
+
+	// insert
+	d_nodes = g_array_insert_val(d_nodes, i, node);
+
+	// modify the previous node so its ->next field points to 'node' ( at pos i )
+	// do that only if we didnt create the first node.
+	if ( i != 0 )
+		g_array_index(d_nodes, GnomeCmdFoldviewTreestore::node*, i - 1)->a_next = node;
+
+	// modify 'node' so its ->next field points to the node at pos i + 1
+	// here we have collated, so we are sure that we have taken the place
+	// of a node, that is now just after us
+	node->a_next = g_array_index(d_nodes, GnomeCmdFoldviewTreestore::node*, i + 1);
+
+	// increase by 1 all ->pos fields of nodes following 'node'
+	temp = node->next();
+	g_assert(temp);
+	while ( temp )
+	{
+		temp->a_pos++;
+		temp = temp->next();
+	}
+	
+	a_card++;
+	return node;
+}
+
+
+//=============================================================================
+
+  /**
+	*   GnomeCmdFoldviewTreestore::node_block::node_cut:
+	*
+	*   @node : the node to cut
+	*
+	*   Cut the node, i.e. simply remove its pointer from the node_block
+	*   it belongs to, and delete it;
+	*
+	**/
+
+//=============================================================================
+/*
+void
+GnomeCmdFoldviewTreestore::node_block::node_cut(
+	GnomeCmdFoldviewTreestore::node*	node)
+{
+	GnomeCmdFoldviewTreestore::node*		follow  = NULL;
+	gint									i		= 0;
+	gint									pos		= 0;
+	//.........................................................................
+
+	pos = node->pos();
+
+	// remove the node from the array
+	g_array_remove_index(d_nodes, pos);
+	a_card--;
+
+	// now update all node->a_pos, starting from node->pos() since it just
+	// has been replaced by GArray call
+	for ( i = pos ; i < a_card ; i ++ )
+	{
+		follow = g_array_index(d_nodes, GnomeCmdFoldviewTreestore::node*, i);
+		follow->a_pos -= 1;
+	}
+
+	// delete the node, it will automatically call delete on the Data* member
+	delete node;
+
+	// modify the previous->a_next field
+	if ( pos != 0 )
+		g_array_index(d_nodes, GnomeCmdFoldviewTreestore::node*, pos - 1)->a_next = NULL;
+
+}
+*/
+
+//=============================================================================
+
+  /**
+	*   GnomeCmdFoldviewTreestore::node_block::purge:
+	*
+	*   @node : the node of this block to remove
+	*
+	*   _RECURSIVELY_ remove all the nodes of the block.
+	*   After this call, the block is set to have 0 child.
+	*
+	**/
+
+//=============================================================================
+gint
+GnomeCmdFoldviewTreestore::node_block::purge()
+{
+	GnomeCmdFoldviewTreestore::node*		node	= NULL;
+	GnomeCmdFoldviewTreestore::node*		next	= NULL;
+	gint									count   = 0;
+	//.........................................................................
+
+	node = node_get(0);
+
+	while ( node )
+	{
+		next = node->next();
+		count += node->purge();
+		delete node;
+		node = next;
+	}
+
+	// update block 
+	//g_array_remove_range(d_nodes, 0, a_card - 1);
+	//a_card = 0;
+	return count;
+}
+
+gint
+GnomeCmdFoldviewTreestore::node_block::purge_and_update()
+{
+	GnomeCmdFoldviewTreestore::node*		node	= NULL;
+	GnomeCmdFoldviewTreestore::node*		next	= NULL;
+	gint									count   = 0;
+	//.........................................................................
+
+	node = node_get(0);
+
+	while ( node )
+	{
+		next = node->next();
+		count += node->purge();
+		delete node;
+		node = next;
+	}
+
+	// update block 
+	//g_array_remove_range(pointer, index, length);
+	g_array_remove_range(d_nodes, 0, a_card);
+	a_card = 0;
+	return count;
+}
+
+
+//  ###########################################################################
+//  ###																		###
+//  ##																		 ##
+//  #					TREESTORE  - CUSTOM METHODS							  #
+//  ##																		 ##
+//  ###																		###
+//  ###########################################################################
+
+GnomeCmdFoldviewTreestore::eRenderFlags 
+	GnomeCmdFoldviewTreestore::Render_flags = 
+		(GnomeCmdFoldviewTreestore::eRenderFlags)
+			(   GnomeCmdFoldviewTreestore::eSortDescending			|
+				GnomeCmdFoldviewTreestore::eSortCaseSensitive
+			);
+
+//=============================================================================
+
+  /**
+	*   GnomeCmdFoldviewTreestore::Iter_is_valid:
+	*
+	*   @iter : the iter to check
+	*
+	**/
+
+//=============================================================================
+inline gboolean 
+GnomeCmdFoldviewTreestore::iter_is_valid(
+	GtkTreeIter *iter)
+{
+	g_return_val_if_fail( iter->stamp == stamp(), FALSE );
+
+	return TRUE;
+}
+
+//=============================================================================
+
+  /**
+	*   GnomeCmdFoldviewTreestore::Iter_is_valid_but_may_be_null:
+	*
+	*   @iter : the iter to check
+	*
+	**/
+
+//=============================================================================
+inline gboolean
+GnomeCmdFoldviewTreestore::iter_is_valid_but_may_be_null(
+	GtkTreeIter *iter)
+{
+	if ( !iter )
+		return TRUE;
+
+	return iter_is_valid(iter);
+}
+
+//=============================================================================
+
+  /**
+	*   GnomeCmdFoldviewTreestore::emit_row_inserted:
+	*
+	*   @iter : the iter to check
+	*
+	**/
+
+//=============================================================================
+void GnomeCmdFoldviewTreestore::emit_row_inserted(
+GnomeCmdFoldviewTreestore::node* node)
+{
+	GtkTreePath					*path = NULL;
+	GtkTreeIter					iter;
+	//.........................................................................
+	g_assert( node );
+
+	ITER_FROM_NODE(this, &iter, node);
+
+	path = get_path(GTK_TREE_MODEL(this), &iter);
+
+	gtk_tree_model_row_inserted(
+		GTK_TREE_MODEL(this),
+		path,
+		&iter);
+
+	gtk_tree_path_free(path);
+}
+
+//=============================================================================
+
+  /**
+	*   GnomeCmdFoldviewTreestore::emit_row_changed:
+	*
+	*   @iter : the iter to check
+	*
+	**/
+
+//=============================================================================
+void GnomeCmdFoldviewTreestore::emit_row_changed(
+GnomeCmdFoldviewTreestore::node* node)
+{
+	GtkTreePath					*path = NULL;
+	GtkTreeIter					iter;
+	//.........................................................................
+	g_assert( node );
+
+	ITER_FROM_NODE(this, &iter, node);
+
+	path = get_path(GTK_TREE_MODEL(this), &iter);
+
+	gtk_tree_model_row_changed(
+		GTK_TREE_MODEL(this),
+		path,
+		&iter);
+
+	gtk_tree_path_free(path);
+}
+
+
+//=============================================================================
+
+  /**
+	*   GnomeCmdFoldviewTreestore::add_child:
+	*
+	*	@in_parent  : the iter that will have a new child
+	*	@out_child  : the child that will be created
+	*	@data		: user's data for the child
+	*
+	*   Add a child, respect to sorting
+	*
+	*   Special case : if in_parent is NULL, set the toplevel node
+	*
+	**/
+
+//=============================================================================
+void 
+GnomeCmdFoldviewTreestore::add_child(
+	GtkTreeIter							*in_parent,
+	GtkTreeIter							*out_child, 
+	GnomeCmdFoldviewTreestore::Data		*data)
+{
+	GnomeCmdFoldviewTreestore::node				*n_parent	= NULL;
+	GnomeCmdFoldviewTreestore::node				*n_child	= NULL;
+	//......................................................................... 
+	g_return_if_fail( iter_is_valid_but_may_be_null(in_parent) );
+
+	// try to set node_root
+	if ( ! in_parent )
+	{
+		g_return_if_fail( ! node_root() );
+
+		d_node_root = new ( 1, 0, NULL, data) GnomeCmdFoldviewTreestore::node;
+		n_child = d_node_root;
+	}
+	else
+	{
+		NODE_FROM_ITER(n_parent, in_parent );
+		g_return_if_fail( n_parent );
+
+		n_child = n_parent->children()->node_append(data);
+	}
+
+	ITER_FROM_NODE(this, out_child, n_child);
+	emit_row_inserted( n_child );
+}
+
+//=============================================================================
+
+  /**
+	*   GnomeCmdFoldviewTreestore::set_value:
+	*
+	*   @iter : the iter to check
+	*
+	**/
+
+//=============================================================================
+void GnomeCmdFoldviewTreestore::set_value(
+	GtkTreeIter *in,
+	gint		column,
+	GValue		*value)
+{
+	GnomeCmdFoldviewTreestore::node				*node		= NULL;
+	//......................................................................... 
+	g_return_if_fail ( iter_is_valid(in) );
+	g_return_if_fail ( value );
+
+	g_return_if_fail( G_IS_VALUE(value) );
+	g_return_if_fail( G_VALUE_TYPE(value) == G_TYPE_POINTER );
+
+	// specific to foldview
+	g_return_if_fail( G_VALUE_HOLDS(value, G_TYPE_POINTER) );
+
+	NODE_FROM_ITER(node, in);
+	g_assert(node);
+
+	GnomeCmdFoldviewTreestore::Data* data = node->data();
+
+	if ( data )
+		delete data;
+
+	node->data() = (GnomeCmdFoldviewTreestore::Data*)g_value_get_pointer(value);
+
+	emit_row_changed( node );
+}
+
+//=============================================================================
+
+  /**
+	*   GnomeCmdFoldviewTreestore::remove_children:
+	*
+	*   @iter : the iter to check
+	*
+	**/
+
+//=============================================================================
+gint GnomeCmdFoldviewTreestore::remove_children(
+	GtkTreeIter *in)
+{
+	GnomeCmdFoldviewTreestore::node				*node		= NULL;
+	//......................................................................... 
+	g_return_val_if_fail ( iter_is_valid(in), 0 );
+
+	NODE_FROM_ITER(node, in);
+	g_return_val_if_fail( node, 0 );
+
+	gint count = node->children()->purge_and_update();
+
+	return count;
+}
+
+
+
+//  ###########################################################################
+//  ###																		###
+//  ##																		 ##
+//  #				TREESTORE  - GtkTreeModelIface IMPLEMENTATION			  #
+//  ##																		 ##
+//  ###																		###
+//  ###########################################################################
+
+//=============================================================================
+
+  /**
+	*   GnomeCmdFoldviewTreestore::get_flags:
+	*
+	*   Tells the rest of the world whether our tree model has any special 
+	*   characteristics. In our case, tree iters are non persistent
+	*
+	**/
+
+//=============================================================================
+GtkTreeModelFlags
+GnomeCmdFoldviewTreestore::get_flags(GtkTreeModel *tree_model)
+{
+  g_return_val_if_fail (IS_GNOME_CMD_FOLDVIEW_TREESTORE(tree_model), (GtkTreeModelFlags)0);
+ 
+  return (GtkTreeModelFlags)0;
+}
+ 
+//=============================================================================
+
+  /**
+	*   GnomeCmdFoldviewTreestore::get_n_columns:
+	*
+	*   We have only one column.
+	*
+	**/
+
+//=============================================================================
+gint
+GnomeCmdFoldviewTreestore::get_n_columns(GtkTreeModel *tree_model)
+{
+  //g_return_val_if_fail (IS_GNOME_CMD_FOLDVIEW_TREESTORE(tree_model), 0);
+ 
+  return 1;
+}
+ 
+//=============================================================================
+
+  /**
+	*   GnomeCmdFoldviewTreestore::get_column_type:
+	*
+	*   Our column is of type G_POINTER
+	*
+	**/
+
+//=============================================================================
+GType
+GnomeCmdFoldviewTreestore::get_column_type(
+	GtkTreeModel *treemodel,
+	gint          index)
+{
+  g_return_val_if_fail (IS_GNOME_CMD_FOLDVIEW_TREESTORE(treemodel), G_TYPE_INVALID);
+  g_return_val_if_fail (index == 0, G_TYPE_INVALID);
+ 
+  return G_TYPE_POINTER;
+}
+
+//=============================================================================
+
+  /**
+	*   GnomeCmdFoldviewTreestore::get_iter:
+	*
+	*   Converts a tree path (physical position) into a tree iter structure.
+	*
+	**/
+
+//=============================================================================
+gboolean
+GnomeCmdFoldviewTreestore::get_iter(
+	GtkTreeModel *treemodel,
+	GtkTreeIter  *iter,
+	GtkTreePath  *path)
+{
+	GnomeCmdFoldviewTreestore					*treestore  = NULL;
+	GnomeCmdFoldviewTreestore::node				*node		= NULL;
+	GnomeCmdFoldviewTreestore::node_block		*block		= NULL;
+	gint          *indices = NULL, pos = 0, depth =0;
+	gint		i = 0;
+	//......................................................................... 
+	g_assert( IS_GNOME_CMD_FOLDVIEW_TREESTORE(treemodel) );
+	g_assert( path!=NULL );
+
+	treestore = GNOME_CMD_FOLDVIEW_TREESTORE(treemodel);
+
+	indices = gtk_tree_path_get_indices(path);
+	depth   = gtk_tree_path_get_depth(path);
+	g_assert( indices );
+	g_assert( depth > 0 );
+
+
+	// foldview specific : we have only one toplevel node
+	pos		= indices[i++];
+	g_assert( pos == 0 );
+
+	// ok, get root node
+	node	=   treestore->node_root();
+
+	// treestore is empty !
+	if ( ! node )
+		return FALSE;
+
+	// loop
+	while ( i < depth )
+	{
+		g_assert(node);
+
+		// go further
+		block   = node->children();
+		pos		= indices[i++];
+		node	= block->node_get(pos);
+	}
+
+	g_assert(node);
+
+	ITER_FROM_NODE(treestore, iter, node);
+	return TRUE;
+}
+ 
+ 
+//=============================================================================
+
+  /**
+	*   GnomeCmdFoldviewTreestore::get_path:
+	*
+	*  Converts a tree iter into a tree path
+	*
+	**/
+
+//=============================================================================
+GtkTreePath *
+GnomeCmdFoldviewTreestore::get_path(
+	GtkTreeModel *treemodel,
+	GtkTreeIter  *iter)
+{
+	GnomeCmdFoldviewTreestore					*treestore  = NULL;
+	GtkTreePath									*path		= NULL;
+	GnomeCmdFoldviewTreestore::node				*node		= NULL;
+	//......................................................................... 
+	g_return_val_if_fail ( IS_GNOME_CMD_FOLDVIEW_TREESTORE(treemodel), NULL );
+	treestore = GNOME_CMD_FOLDVIEW_TREESTORE(treemodel);
+	g_return_val_if_fail ( treestore->iter_is_valid(iter), NULL);
+
+	path = gtk_tree_path_new();
+
+	NODE_FROM_ITER(node, iter);
+	g_return_val_if_fail( node, NULL );
+
+	while ( node )
+	{
+		gtk_tree_path_prepend_index(path, node->pos());
+		node = node->parent();
+	}
+
+	STORE_INF("get_path:%s", gtk_tree_path_to_string(path));
+
+	return path;
+}
+ 
+ 
+//=============================================================================
+
+  /**
+	*   GnomeCmdFoldviewTreestore::get_value:
+	*
+	*  Converts a tree iter into a tree path
+	*
+	**/
+
+//=============================================================================
+void
+GnomeCmdFoldviewTreestore::get_value(
+	GtkTreeModel *treemodel,
+	GtkTreeIter  *iter,
+	gint          column,
+	GValue       *value)
+{
+	GnomeCmdFoldviewTreestore					*treestore  = NULL;
+	GnomeCmdFoldviewTreestore::node				*node		= NULL;
+	//......................................................................... 
+	g_return_if_fail ( IS_GNOME_CMD_FOLDVIEW_TREESTORE(treemodel) );
+	treestore = GNOME_CMD_FOLDVIEW_TREESTORE(treemodel);
+	g_return_if_fail ( treestore->iter_is_valid(iter) );
+	g_return_if_fail ( column == 0 );
+	g_return_if_fail ( value );
+
+	NODE_FROM_ITER(node, iter);
+	g_assert(node);
+
+	g_value_init(value, G_TYPE_POINTER);
+	g_value_set_pointer(value, node->data());
+}
+ 
+ 
+//=============================================================================
+
+  /**
+	*   GnomeCmdFoldviewTreestore::iter_next:
+	*
+	*   Takes an iter structure and sets it to point to the next row.
+	*
+	**/
+
+//=============================================================================
+gboolean
+GnomeCmdFoldviewTreestore::iter_next(
+	GtkTreeModel  *treemodel,
+	GtkTreeIter   *iter)
+{
+	GnomeCmdFoldviewTreestore					*treestore  = NULL;
+	GnomeCmdFoldviewTreestore::node				*node		= NULL;
+	//......................................................................... 
+	g_return_val_if_fail ( IS_GNOME_CMD_FOLDVIEW_TREESTORE(treemodel), FALSE );
+	treestore = GNOME_CMD_FOLDVIEW_TREESTORE(treemodel);
+	g_return_val_if_fail ( treestore->iter_is_valid(iter), FALSE );
+
+	NODE_FROM_ITER(node, iter);
+	g_assert(node);
+
+	node = node->next();
+	if ( !node )
+		return FALSE;
+
+	ITER_FROM_NODE(treestore, iter, node);
+	return TRUE;
+}
+ 
+ 
+//=============================================================================
+
+  /**
+	*   GnomeCmdFoldviewTreestore::iter_children:
+	*
+	*   Returns TRUE or FALSE depending on whether the row specified by
+	*   'parent' has any children. If it has children, then 'iter' is set to
+	*   point to the first child. 
+	*
+	*   Special case: if 'parent' is NULL, then the first top-level row should 
+	*   be returned if it exists.
+	*
+	**/
+
+//=============================================================================
+gboolean
+GnomeCmdFoldviewTreestore::iter_children(
+	GtkTreeModel *treemodel,
+	GtkTreeIter  *iter_child,
+	GtkTreeIter  *iter_parent)
+{
+	GnomeCmdFoldviewTreestore					*treestore  = NULL;
+	GnomeCmdFoldviewTreestore::node				*node		= NULL;
+	//......................................................................... 
+	g_return_val_if_fail ( IS_GNOME_CMD_FOLDVIEW_TREESTORE(treemodel), FALSE );
+	treestore = GNOME_CMD_FOLDVIEW_TREESTORE(treemodel);
+	g_return_val_if_fail ( treestore->iter_is_valid_but_may_be_null(iter_parent), FALSE );
+
+	if ( ! iter_parent )
+	{
+		node = treestore->node_root();
+			g_return_val_if_fail( node, FALSE );
+
+		ITER_FROM_NODE(treestore, iter_child, node);
+		return TRUE;
+	}
+
+	NODE_FROM_ITER(node, iter_parent);
+	g_assert(node);
+
+	if ( node->children()->card() )
+	{
+		ITER_FROM_NODE(treestore, iter_child, node->children()->node_get(0));
+		return TRUE;
+	}
+
+	return FALSE;
+}
+ 
+//=============================================================================
+
+  /**
+	*   GnomeCmdFoldviewTreestore::iter_has_child:
+	*
+	*   Returns TRUE or FALSE depending on whether the row specified by 'iter' 
+	*   has any children.
+	*
+	**/
+
+//=============================================================================
+gboolean
+GnomeCmdFoldviewTreestore::iter_has_child(
+	GtkTreeModel *treemodel,
+	GtkTreeIter  *iter)
+{
+	GnomeCmdFoldviewTreestore					*treestore  = NULL;
+	GnomeCmdFoldviewTreestore::node				*node		= NULL;
+	//......................................................................... 
+	g_return_val_if_fail ( IS_GNOME_CMD_FOLDVIEW_TREESTORE(treemodel), FALSE );
+	treestore = GNOME_CMD_FOLDVIEW_TREESTORE(treemodel);
+	g_return_val_if_fail ( treestore->iter_is_valid(iter), FALSE );
+
+	NODE_FROM_ITER(node, iter);
+	g_assert(iter);
+
+	return node->children()->card() != 0 ? TRUE : FALSE;
+}
+ 
+ 
+//=============================================================================
+
+  /**
+	*   GnomeCmdFoldviewTreestore::iter_n_children:
+	*
+	*   Returns the number of children the row specified by 'iter' has.
+	*
+	*   Special case : if 'iter' is NULL, return the number of top-level nodes
+	*
+	**/
+
+//=============================================================================
+gint
+GnomeCmdFoldviewTreestore::iter_n_children(
+	GtkTreeModel *treemodel,
+	GtkTreeIter  *iter)
+{
+	GnomeCmdFoldviewTreestore					*treestore  = NULL;
+	GnomeCmdFoldviewTreestore::node				*node		= NULL;
+	//......................................................................... 
+	g_return_val_if_fail ( IS_GNOME_CMD_FOLDVIEW_TREESTORE(treemodel), 0 );
+	treestore = GNOME_CMD_FOLDVIEW_TREESTORE(treemodel);
+	g_return_val_if_fail ( treestore->iter_is_valid_but_may_be_null(iter), 0 );
+
+	// We have only one node_root for instant
+	if ( ! iter )
+		return 1;
+
+	NODE_FROM_ITER(node, iter);
+	g_assert(node);
+
+	return node->children()->card();
+}
+ 
+ 
+//=============================================================================
+
+  /**
+	*   GnomeCmdFoldviewTreestore::iter_nth_child:
+	*
+	*   If the row specified by 'parent' has any children, set 'iter' to the 
+	*   n-th child and return TRUE if it exists, otherwise FALSE.
+	*
+	*   Special case : if 'parent' is NULL, we need to set 'iter' to the n-th
+	*   toplevel node.
+	*
+	**/
+
+//=============================================================================
+gboolean
+GnomeCmdFoldviewTreestore::iter_nth_child(
+	GtkTreeModel *treemodel,
+	GtkTreeIter  *iter_child,
+	GtkTreeIter  *iter_parent,
+	gint          n)
+{
+	GnomeCmdFoldviewTreestore					*treestore  = NULL;
+	GnomeCmdFoldviewTreestore::node				*node		= NULL;
+	GnomeCmdFoldviewTreestore::node_block		*block		= NULL;
+	//......................................................................... 
+	g_return_val_if_fail ( IS_GNOME_CMD_FOLDVIEW_TREESTORE(treemodel), FALSE );
+	treestore = GNOME_CMD_FOLDVIEW_TREESTORE(treemodel);
+	g_return_val_if_fail ( treestore->iter_is_valid_but_may_be_null(iter_parent), FALSE );
+
+	if ( ! iter_parent )
+	{
+		ITER_FROM_NODE(treestore, iter_child, treestore->node_root());
+		return TRUE;
+	}
+
+	NODE_FROM_ITER(node, iter_parent);
+	g_assert( node );
+
+	block = node->children();
+
+	if ( n >= block->card() )
+		return FALSE;
+
+	ITER_FROM_NODE(treestore, iter_child, block->node_get(n));
+	return TRUE;
+}
+
+//=============================================================================
+
+  /**
+	*   GnomeCmdFoldviewTreestore::iter_parent:
+	*
+	*   Point 'iter_parent' to the parent node of 'iter_child'.
+	*
+	**/
+
+//=============================================================================
+gboolean
+GnomeCmdFoldviewTreestore::iter_parent(
+	GtkTreeModel *treemodel,
+	GtkTreeIter  *iter_parent,
+	GtkTreeIter  *iter_child)
+{
+	GnomeCmdFoldviewTreestore					*treestore  = NULL;
+	GnomeCmdFoldviewTreestore::node				*node		= NULL;
+	//......................................................................... 
+	g_return_val_if_fail ( IS_GNOME_CMD_FOLDVIEW_TREESTORE(treemodel), FALSE );
+	treestore = GNOME_CMD_FOLDVIEW_TREESTORE(treemodel);
+	g_return_val_if_fail ( treestore->iter_is_valid(iter_child), FALSE );
+
+	NODE_FROM_ITER(node, iter_child);
+	g_assert( node );
+	g_assert( node != treestore->node_root() );
+
+	node = node->parent();
+	g_assert( node );
+	ITER_FROM_NODE(treestore, iter_parent, node);
+	 
+	return TRUE;
+}
+ 
+ 
+ 
+//  ###########################################################################
+//  ###																		###
+//  ##																		 ##
+//  #					TREESTORE  - GOBJECT STUFF							  #
+//  ##																		 ##
+//  ###																		###
+//  ###########################################################################
+
+// GObject stuff - nothing to worry about
+static GObjectClass *parent_class = NULL;
+
+static void gnome_cmd_foldview_treestore_init(GnomeCmdFoldviewTreestore*);
+static void gnome_cmd_foldview_treestore_class_init(GnomeCmdFoldviewTreestoreClass *klass);
+static void gnome_cmd_foldview_treestore_tree_model_init (GtkTreeModelIface *iface);
+static void gnome_cmd_foldview_treestore_finalize(GObject *object);
+
+//=============================================================================
+
+  /**
+	*   gnome_cmd_foldview_treestore_init:
+	*   
+	*   This is called everytime a new custom list object instance is created 
+	*   (we do that in gnome_cmd_foldview_treestore_new).
+	*
+	**/
+
+//=============================================================================
+static void
+gnome_cmd_foldview_treestore_init(
+GnomeCmdFoldviewTreestore *treestore)
+{
+	treestore->stamp_init();
+	treestore->node_root_init();
+}
+
+//=============================================================================
+
+  /**
+	*   gnome_cmd_foldview_treestore_class_init:
+	*
+	*   More boilerplate GObject/GType stuff. Init callback for the type system,
+	*   called once when our new class is created.
+	*
+	**/
+
+//=============================================================================
+static void
+gnome_cmd_foldview_treestore_class_init(GnomeCmdFoldviewTreestoreClass *klass)
+{
+  GObjectClass *object_class;
+ 
+  parent_class = (GObjectClass*) g_type_class_peek_parent (klass);
+  object_class = (GObjectClass*) klass;
+ 
+  object_class->finalize = gnome_cmd_foldview_treestore_finalize;
+}
+
+//=============================================================================
+
+  /**
+	*   gnome_cmd_foldview_treestore_tree_model_init:
+	*
+	*   Init callback for the interface registration in 
+	*   gnome_cmd_foldview_treestore_get_type. Here we override the 
+	*   GtkTreeModel interface functions that we implement.
+	*
+	**/
+
+//=============================================================================
+static void
+gnome_cmd_foldview_treestore_tree_model_init (GtkTreeModelIface *iface)
+{
+	iface->get_flags       = GnomeCmdFoldviewTreestore::get_flags;
+	iface->get_n_columns   = GnomeCmdFoldviewTreestore::get_n_columns;
+	iface->get_column_type = GnomeCmdFoldviewTreestore::get_column_type;
+	iface->get_iter        = GnomeCmdFoldviewTreestore::get_iter;
+	iface->get_path        = GnomeCmdFoldviewTreestore::get_path;
+	iface->get_value       = GnomeCmdFoldviewTreestore::get_value;
+	iface->iter_next       = GnomeCmdFoldviewTreestore::iter_next;
+	iface->iter_children   = GnomeCmdFoldviewTreestore::iter_children;
+	iface->iter_has_child  = GnomeCmdFoldviewTreestore::iter_has_child;
+	iface->iter_n_children = GnomeCmdFoldviewTreestore::iter_n_children;
+	iface->iter_nth_child  = GnomeCmdFoldviewTreestore::iter_nth_child;
+	iface->iter_parent     = GnomeCmdFoldviewTreestore::iter_parent;
+}
+
+
+//=============================================================================
+
+  /**
+	*   gnome_cmd_foldview_treestore_finalize:
+	*
+	*   This is called just before an instance is destroyed. Free dynamically 
+	*   allocated memory here.
+	*
+	**/
+
+//=============================================================================
+static void
+gnome_cmd_foldview_treestore_finalize(GObject *object)
+{
+	GnomeCmdFoldviewTreestore					*treestore  = NULL;
+	//......................................................................... 
+	g_return_if_fail ( IS_GNOME_CMD_FOLDVIEW_TREESTORE(object) );
+	treestore = GNOME_CMD_FOLDVIEW_TREESTORE(object);
+
+	// free all records and free all memory used by the list
+	treestore->clear();
+
+	// must chain up - finalize parent
+	(* parent_class->finalize) (object);
+}
+
+//=============================================================================
+
+  /**
+	*   gnome_cmd_foldview_treestore_get_type:
+	*
+	*  Here we register our new type and its interfaces
+	*  with the type system. If you want to implement
+	*  additional interfaces like GtkTreeSortable, you
+	*  will need to do it here.
+	*
+	**/
+
+//=============================================================================
+GType
+gnome_cmd_foldview_treestore_get_type (void)
+{
+	static GType gnome_cmd_foldview_treestore_type = 0;
+
+	/* Some boilerplate type registration stuff */
+	if (gnome_cmd_foldview_treestore_type == 0)
+	{
+		static const GTypeInfo gnome_cmd_foldview_treestore_info =
+		{
+			sizeof (GnomeCmdFoldviewTreestoreClass),
+			NULL,                                         /* base_init */
+			NULL,                                         /* base_finalize */
+			(GClassInitFunc) gnome_cmd_foldview_treestore_class_init,
+			NULL,                                         /* class finalize */
+			NULL,                                         /* class_data */
+			sizeof (GnomeCmdFoldviewTreestore),
+			0,                                           /* n_preallocs */
+			(GInstanceInitFunc) gnome_cmd_foldview_treestore_init
+		};
+		static const GInterfaceInfo tree_model_info =
+		{
+			(GInterfaceInitFunc) gnome_cmd_foldview_treestore_tree_model_init,
+			NULL,
+			NULL
+		};
+
+		/* First register the new derived type with the GObject type system */
+		gnome_cmd_foldview_treestore_type = g_type_register_static (G_TYPE_OBJECT, "CustomList",
+		&gnome_cmd_foldview_treestore_info, (GTypeFlags)0);
+
+		/* Now register our GtkTreeModel interface with the type system */
+		g_type_add_interface_static (gnome_cmd_foldview_treestore_type, GTK_TYPE_TREE_MODEL, &tree_model_info);
+	}
+ 
+  return gnome_cmd_foldview_treestore_type;
+}
+
+//=============================================================================
+
+  /**
+	*   gnome_cmd_foldview_treestore_new:
+	*
+	**/
+
+//=============================================================================
+GnomeCmdFoldviewTreestore*
+gnome_cmd_foldview_treestore_new(void)
+{
+  GnomeCmdFoldviewTreestore *t;
+ 
+  t = (GnomeCmdFoldviewTreestore*) g_object_new (GNOME_CMD_FOLDVIEW_TREESTORE_TYPE, NULL);
+ 
+  g_assert( t != NULL );
+ 
+  return t;
+}
+
+ 
+ 
+
+
diff --git a/src/gnome-cmd-foldview-treestore.h b/src/gnome-cmd-foldview-treestore.h
new file mode 100644
index 0000000..179d329
--- /dev/null
+++ b/src/gnome-cmd-foldview-treestore.h
@@ -0,0 +1,280 @@
+#ifndef _GNOME_CMD_FOLDVIEW_TREESTORE_H_
+#define _GNOME_CMD_FOLDVIEW_TREESTORE_H_
+
+#include <gtk/gtk.h>
+
+//***************************************************************************** 
+//
+//  Docs
+//
+//***************************************************************************** 
+/*
+
+	GtkTreeIter usage:
+	{
+		gint		stamp		: ginu
+		gpointer	user_data   : treestore data : pointer on node ( GnomeCmdFoldviewTreestore::node* )
+		gpointer	user_data2  : NULL ( for instant : this is the place for the collate key )
+		gpointer	user_data3  : treestore's user data
+	}
+
+	So for each valid GtkTreeIter, we have iter->node->data() == iter->user_data3 ; 
+	and a treestore's user can just do : get_iter(path), then (user's_type*)iter->user_data3
+	instead of treestore->get_value(g_value_stuff...)
+	Note that treestore code does that as well...
+	
+	
+*/
+
+//***************************************************************************** 
+//
+//					Object definition
+//
+//***************************************************************************** 
+#define GNOME_CMD_FOLDVIEW_TREESTORE_TYPE            (gnome_cmd_foldview_treestore_get_type())
+
+#define GNOME_CMD_FOLDVIEW_TREESTORE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GNOME_CMD_FOLDVIEW_TREESTORE_TYPE, GnomeCmdFoldviewTreestore))
+
+#define IS_GNOME_CMD_FOLDVIEW_TREESTORE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GNOME_CMD_FOLDVIEW_TREESTORE_TYPE))
+
+struct GnomeCmdFoldviewTreestore
+{
+	//=========================================================================
+	//
+	//								Data
+	//
+	//  This structure is for :
+	//
+	//  - calling delete from the store, so indirectly calling destructor
+	//    of user's subclass automaically
+	//  - ensure we have a collate key
+	//  - debugging purpose
+	//
+	//=========================================================================
+	struct Data
+	{
+		private:
+		static  gint	Count;
+		//.................................................................
+		public:
+		virtual const gchar* utf8_collate_key() = 0;
+		//.................................................................
+		public:
+		Data();
+		virtual ~Data() = 0;	// forbid instantiation
+	};
+	
+	//=========================================================================
+	//
+	//								Nodes 
+	//
+	//=========================================================================
+	struct node_block;
+
+	struct node
+	{
+		friend struct node_block;
+
+		private:
+		static  gint Count;
+
+		private:
+		gint								a_pos;
+		node							*   a_parent;
+		node							*   a_next;
+		node_block						*   a_children;
+		GnomeCmdFoldviewTreestore::Data *	d_data;
+		//.................................................................
+		public:
+		void*		operator new	(size_t size, gint _depth, gint _pos, node *_parent, GnomeCmdFoldviewTreestore::Data* _data);
+		public:
+		void		operator delete (void *p);	
+		//.................................................................
+		public:
+		const gchar*		log();
+		//.................................................................
+		public:
+		gint				pos()		{ return a_pos;			}
+		node			*   parent()	{ return a_parent;		}
+		node			*   next()		{ return a_next;		}
+		node_block		*   children()	{ return a_children;	}
+		Data*&				data()		{ return d_data;		}				// only this can be modified by all
+
+		private:
+		gint		purge();
+	};
+
+	//=========================================================================
+	//
+	//							Node blocks
+	//
+	//=========================================================================
+	struct node_block
+	{
+		private:
+		static  gint Count;
+
+		private:
+		gint				a_card;
+		guint				a_depth;
+		node			*   a_parent;
+		// d_nodes will be a GArray of node* ; we dont store entire node structs
+		// for speeding the sort ; the counterpart is that we will be forced
+		// to malloc each node
+		GArray			*   d_nodes;
+		//.................................................................
+		public:
+		void*		operator new	(size_t size, guint _depth, node *_parent);
+		void		operator delete (void *p);	
+		//.................................................................
+		public:
+		gint				card()		{ return a_card;	}
+		guint				depth()		{ return a_depth;   }
+		GArray*				array()		{ return d_nodes;   }
+		//.................................................................
+		private:
+		// useless for instant
+		//void		node_cut			(node		*node);
+		public:
+		node	*   node_get			(gint		index);
+		node	*	node_append			(Data		*data);
+		gint		purge();
+		gint		purge_and_update();
+	};
+
+	//=========================================================================
+	//
+	//						Object
+	//
+	//=========================================================================
+	//
+	//  GObject inheritance
+	//
+	public:
+	GObject				parent;
+
+	//.........................................................................
+	//  root node
+	//.........................................................................
+	private:
+	node				*d_node_root;
+	public:
+	node*				node_root()			{ return d_node_root;   }
+	void				node_root_init()	{ d_node_root = NULL;   }
+	//.........................................................................
+	//  stamp
+	//.........................................................................
+	private:
+	gint        		a_stamp;
+	public:
+	inline  gint		stamp()			{ return a_stamp;			}
+	void				stamp_init()	{ a_stamp = 0x00;		}
+
+	//.........................................................................
+	//  rendering
+	//.........................................................................
+	public:
+	enum eRenderFlags
+	{
+		eSortAscending		= 0x01,
+		eSortDescending		= 0x02,
+		eSortCaseSensitive	= 0x04
+	};
+	static  eRenderFlags	Render_flags;
+
+	public:
+	static  gboolean	Render_sort()					{ return Render_flags != 0;						}
+	static  gboolean	Render_sort_case_sensitive()	{ return Render_flags & eSortCaseSensitive;		}
+	static  gboolean	Render_sort_ascending()			{ return Render_flags & eSortAscending;			}
+	static  gboolean	Render_sort_descending()		{ return Render_flags & eSortDescending;		}
+	
+	public:
+	gboolean	set_render_flags(eRenderFlags flags)
+				{
+					eRenderFlags old = Render_flags;
+					Render_flags = flags;
+					
+					if ( Render_sort_case_sensitive() )
+					{
+						if ( !Render_sort_ascending() && !Render_sort_descending() )
+						{
+							Render_flags = old;
+							return FALSE;
+						}
+					}
+
+					return TRUE;
+				}
+
+	//.........................................................................
+	// GtkTreeModel interface
+	//.........................................................................
+	public:
+	static  GtkTreeModelFlags   get_flags		(GtkTreeModel*);
+	static  gint				get_n_columns   (GtkTreeModel*);
+	static  GType				get_column_type (GtkTreeModel*, gint index);
+
+	static  gboolean			get_iter		(GtkTreeModel*, GtkTreeIter *out, GtkTreePath  *path);
+	static  GtkTreePath *		get_path		(GtkTreeModel*, GtkTreeIter *in);
+	static  void				get_value		(GtkTreeModel*, GtkTreeIter *in,	gint column, GValue *value);
+	static  gboolean			iter_next		(GtkTreeModel*, GtkTreeIter *inout);
+	static  gboolean			iter_children   (GtkTreeModel*, GtkTreeIter *out, GtkTreeIter *parent);
+	static  gboolean			iter_has_child  (GtkTreeModel*,	GtkTreeIter *in);
+	static  gint				iter_n_children (GtkTreeModel*,	GtkTreeIter *in_parent);
+	static  gboolean			iter_nth_child  (GtkTreeModel*,	GtkTreeIter *out_child,	GtkTreeIter *in_parent,	gint n);
+	static  gboolean			iter_parent		(GtkTreeModel*,	GtkTreeIter *out_parent, GtkTreeIter  *in_child);
+
+	//.........................................................................
+	// our treestore methods
+	//.........................................................................
+	public:
+	// iter validation
+	inline gboolean iter_is_valid(GtkTreeIter*);	
+	inline gboolean	iter_is_valid_but_may_be_null(GtkTreeIter*);	
+	// private helpers for sending signals
+	private:
+	void	emit_row_inserted   (node*);
+	void	emit_row_changed	(node*);
+	// useful for foldview
+	public:
+	void	add_child			(GtkTreeIter *in_parent,	GtkTreeIter *out_child, GnomeCmdFoldviewTreestore::Data*);
+	void	set_value			(GtkTreeIter *in,			gint column, GValue *value);
+	gint	remove_children		(GtkTreeIter *in);	
+	gint	clear()
+			{
+				// store is empty !
+				if ( !d_node_root )
+					return 0;
+					
+				//return d_node_root->children()->node_remove_all(dyn_data);
+				// return 0;
+				delete d_node_root;
+				d_node_root = NULL;
+				
+				return 0;
+			}
+};
+
+GType         					gnome_cmd_foldview_treestore_get_type   (void);
+GnomeCmdFoldviewTreestore*		gnome_cmd_foldview_treestore_new		(void);
+
+ 
+//***************************************************************************** 
+//
+//					Class Definition
+//
+//***************************************************************************** 
+#define GNOME_CMD_FOLDVIEW_TREESTORE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GNOME_CMD_FOLDVIEW_TREESTORE_TYPE, GnomeCmdFoldviewTreestoreClass))
+#define IS_GNOME_CMD_FOLDVIEW_TREESTORE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GNOME_CMD_FOLDVIEW_TREESTORE_TYPE))
+#define GNOME_CMD_FOLDVIEW_TREESTORE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GNOME_CMD_FOLDVIEW_TREESTORE_TYPE, GnomeCmdFoldviewTreestoreClass))
+
+typedef struct _GnomeCmdFoldviewTreestoreClass  GnomeCmdFoldviewTreestoreClass;
+ 
+struct _GnomeCmdFoldviewTreestoreClass
+{
+  GObjectClass parent_class;
+};
+ 
+
+ 
+#endif
diff --git a/src/gnome-cmd-foldview-view.cc b/src/gnome-cmd-foldview-view.cc
index 70c4fff..4790169 100644
--- a/src/gnome-cmd-foldview-view.cc
+++ b/src/gnome-cmd-foldview-view.cc
@@ -66,7 +66,7 @@
 //  *																		  *
 //  ***************************************************************************
 static void
-myfunc(
+myfunc_pix(
 	GtkTreeViewColumn *col,
 	GtkCellRenderer   *renderer,
 	GtkTreeModel      *model,
@@ -75,9 +75,45 @@ myfunc(
 {
 	gint icon;
 
+#ifdef __GTS__
+
 	gtk_tree_model_get(model, iter, 1, &icon, -1);
+	g_object_set(renderer, "pixbuf", GcmdFoldview()->view.pixbuf( (GcmdGtkFoldview::View::eIcon)icon), NULL);
+
+#else
 
+	GValue v = {0};
+	GnomeCmdFoldviewTreestore::get_value(model, iter, 0, &v);
+	GcmdGtkFoldview::Model::Rowlike *r = (GcmdGtkFoldview::Model::Rowlike*)g_value_get_pointer(&v);
+
+	icon = r->icon();
 	g_object_set(renderer, "pixbuf", GcmdFoldview()->view.pixbuf( (GcmdGtkFoldview::View::eIcon)icon), NULL);
+
+#endif
+}
+
+static void
+myfunc_txt(
+	GtkTreeViewColumn *col,
+	GtkCellRenderer   *renderer,
+	GtkTreeModel      *model,
+	GtkTreeIter       *iter,
+	gpointer           user_data)
+{
+
+#ifdef __GTS__
+
+	// Do nothing, not connect in GTS mode
+
+#else
+
+	GValue v = {0};
+	GnomeCmdFoldviewTreestore::get_value(model, iter, 0, &v);
+	GcmdGtkFoldview::Model::Rowlike *r = (GcmdGtkFoldview::Model::Rowlike*)g_value_get_pointer(&v);
+
+	g_object_set(renderer, "text", r->utf8_name() , NULL);
+
+#endif
 }
 
 //=============================================================================
@@ -158,7 +194,7 @@ void signal_cursor_changed(
 	GtkTreeSelection	*tree_sel		= NULL;
 	gint				tree_sel_card   = 0;
 
-	GtkTreeIter			iter_selected   = GcmdGtkFoldview::Model::s_iter_NULL;
+	GtkTreeIter			iter_selected   = GcmdGtkFoldview::Model::Iter_zero;
 	//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 	//gwr_inf("signal_cursor_changed");
 
@@ -170,14 +206,14 @@ void signal_cursor_changed(
 	}
 
 	// Note: gtk_tree_selection_count_selected_rows() does not
-	//   exist in gtk+-2.0, only in gtk+ >= v2.2 !
+	//   exist in gtk+-2.0, only in gtk+ >= v2.2 ! 
 	tree_sel_card = gtk_tree_selection_count_selected_rows(tree_sel);
 
 	if ( tree_sel_card == 1 )
 	{
 		if ( gtk_tree_selection_get_selected( tree_sel, NULL, &iter_selected) )
 		{
-
+			
 		}
 		else
 		{
@@ -239,7 +275,7 @@ gboolean GcmdGtkFoldview::View::create(GtkWidget *_this, GtkTreeModel *_treemode
 	//gtk_object_set_data_full (GTK_OBJECT (m_this), "infolabel", m_info_label,
 	//	                      (GtkDestroyNotify) g_object_unref);
 	//gtk_misc_set_alignment (GTK_MISC (m_info_label), 0.0f, 0.5f);
-
+	
 	// create the scrollwindow that we'll place the treeview in
 	m_scrolledwindow = gtk_scrolled_window_new(NULL, NULL);
 	gtk_object_set_data_full (GTK_OBJECT (foldview()),
@@ -270,23 +306,23 @@ gboolean GcmdGtkFoldview::View::create(GtkWidget *_this, GtkTreeModel *_treemode
 	//			gint					n_targets,
 	//			GdkDragAction			actions);
 	//
-	//	typedef struct
+	//	typedef struct 
 	//	{
 	//	  gchar *target;
 	//	  guint  flags;
 	//	  guint  info;
-	//	}
+	//	} 
 	//  GtkTargetEntry;
 	//
-	//  typedef enum
+	//  typedef enum 
 	//  {
 	//	  GTK_TARGET_SAME_APP = 1 << 0,    /*< nick=same-app >*/
 	//	  GTK_TARGET_SAME_WIDGET = 1 << 1  /*< nick=same-widget >*/
-	//  }
+	//  } 
 	//  GtkTargetFlags;
 
-	//GtkTargetEntry  drag_source_entry[2]	=
-	//	{
+	//GtkTargetEntry  drag_source_entry[2]	= 
+	//	{ 
 	//		{   (gchar*)"text/plain", 0, 0X30 },
 	//		{   (gchar*)"text/plain", 0, 0X31 }
 	//	};
@@ -299,7 +335,7 @@ gboolean GcmdGtkFoldview::View::create(GtkWidget *_this, GtkTreeModel *_treemode
 	//	GDK_ACTION_PRIVATE );
 
     //g_signal_connect(m_treeview, "drag-begin", G_CALLBACK (signal_drag_begin), (gpointer)this);
-
+		
 	// columns
 	col0 = gtk_tree_view_column_new();
 	gtk_tree_view_column_set_title(col0, _("Folders"));
@@ -309,11 +345,12 @@ gboolean GcmdGtkFoldview::View::create(GtkWidget *_this, GtkTreeModel *_treemode
 	gtk_tree_view_column_set_title(col1, _("Access Rights"));
 	gtk_tree_view_column_set_visible(col1,FALSE);
 
+#ifdef __GTS__
 	// column 0 - pixbuf renderer
 	renderer = gtk_cell_renderer_pixbuf_new();
 	gtk_tree_view_column_pack_start(col0, renderer, FALSE);
 	g_object_set(renderer, "xalign", 0.0, NULL);
-	gtk_tree_view_column_set_cell_data_func(col0, renderer, myfunc, NULL, NULL);
+	gtk_tree_view_column_set_cell_data_func(col0, renderer, myfunc_pix, NULL, NULL);
 
 	// column 0 - text renderer
 	renderer = gtk_cell_renderer_text_new();
@@ -329,6 +366,21 @@ gboolean GcmdGtkFoldview::View::create(GtkWidget *_this, GtkTreeModel *_treemode
 
 	gtk_tree_view_append_column(GTK_TREE_VIEW(m_treeview), col0);
 	gtk_tree_view_append_column(GTK_TREE_VIEW(m_treeview), col1);
+#else
+	// column 0 - pixbuf renderer
+	renderer = gtk_cell_renderer_pixbuf_new();
+	gtk_tree_view_column_pack_start(col0, renderer, FALSE);
+	g_object_set(renderer, "xalign", 0.0, NULL);
+	gtk_tree_view_column_set_cell_data_func(col0, renderer, myfunc_pix, NULL, NULL);
+
+	// column 0 - text renderer
+	renderer = gtk_cell_renderer_text_new();
+	gtk_tree_view_column_pack_start(col0, renderer, FALSE);
+	g_object_set(renderer, "xalign", 0.0, NULL);
+	gtk_tree_view_column_set_cell_data_func(col0, renderer, myfunc_txt, NULL, NULL);
+
+	gtk_tree_view_append_column(GTK_TREE_VIEW(m_treeview), col0);
+#endif
 
 	// signals
 	g_signal_connect(m_treeview, "test_expand_row",		G_CALLBACK(signal_test_expand_row), NULL);
@@ -377,7 +429,7 @@ gboolean GcmdGtkFoldview::View::create(GtkWidget *_this, GtkTreeModel *_treemode
 
 	//-------------------------------------------------------------------------
 	// show, except the pane container
-
+	
 	//fs->update_concombo_visibility();
 	gtk_widget_show(m_con_combo);
 	//gtk_widget_show(m_vol_label);
@@ -395,7 +447,7 @@ gboolean GcmdGtkFoldview::View::create(GtkWidget *_this, GtkTreeModel *_treemode
 
 void GcmdGtkFoldview::View::destroy()
 {
-
+	
 }
 
 //=============================================================================
@@ -444,8 +496,8 @@ void	GcmdGtkFoldview::View::signal_row_collapsed(
 //  Buttons
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 gboolean GcmdGtkFoldview::View::signal_button_press_event(
-	GtkWidget	   *tree_view,
-	GdkEventButton *event,
+	GtkWidget	   *tree_view, 
+	GdkEventButton *event, 
 	gpointer		data)
 {
 	//  signal handled		: return TRUE
@@ -453,7 +505,7 @@ gboolean GcmdGtkFoldview::View::signal_button_press_event(
 	//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 	GtkTreePath								*path_clicked   = NULL;
 
-	GtkTreeIter								iter_selected   = GcmdGtkFoldview::Model::s_iter_NULL;
+	GtkTreeIter								iter_selected   = GcmdGtkFoldview::Model::Iter_zero;
 	GtkTreePath								*path_selected  = NULL;
 
 	GtkTreeSelection						*tree_sel		= NULL;
@@ -464,7 +516,7 @@ gboolean GcmdGtkFoldview::View::signal_button_press_event(
 	// get path to iter over which the user clicked
 	gtk_tree_view_get_path_at_pos(
 		GTK_TREE_VIEW(tree_view),
-		(gint) event->x,
+		(gint) event->x, 
 		(gint) event->y,
 		&path_clicked, NULL, NULL, NULL);
 
@@ -478,17 +530,22 @@ gboolean GcmdGtkFoldview::View::signal_button_press_event(
 	}
 
 	// Note: gtk_tree_selection_count_selected_rows() does not
-	//   exist in gtk+-2.0, only in gtk+ >= v2.2 !
+	//   exist in gtk+-2.0, only in gtk+ >= v2.2 ! 
 	tree_sel_card = gtk_tree_selection_count_selected_rows(tree_sel);
 
 	if ( tree_sel_card == 1 )
 	{
 		if ( gtk_tree_selection_get_selected( tree_sel, NULL, &iter_selected) )
 		{
+#ifdef __GTS__
 			path_selected = gtk_tree_model_get_path(
 				gtk_tree_view_get_model(GTK_TREE_VIEW(tree_view)),
 				&iter_selected);
-
+#else
+			path_selected = GnomeCmdFoldviewTreestore::get_path(
+				gtk_tree_view_get_model(GTK_TREE_VIEW(tree_view)),
+				&iter_selected);
+#endif
 			if ( !path_selected )
 			{
 				gwr_wng("View::signal_button_press_event:gtk_tree_model_get_path failed");
@@ -506,10 +563,10 @@ gboolean GcmdGtkFoldview::View::signal_button_press_event(
 	if ( ( event->type == GDK_BUTTON_PRESS )  &&  ( event->button == 1 ) )
 	{
 		// The GtkTreeSelection will be updated only
-		// in the next loop of gtk_main(), and when calling sync(),
+		// in the next loop of gtk_main(), and when calling sync(), 
 		// the path_selected is still the old selected item, not the
 		// clicked one.
-
+	
 		// So in the sync() function, we use path_clicked instead of
 		// path_selected
 
@@ -570,7 +627,7 @@ gboolean GcmdGtkFoldview::View::signal_button_press_event(
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 void GcmdGtkFoldview::View::signal_drag_begin(
 	GtkWidget	   *widget,
-	GdkDragContext *drag_context,
+	GdkDragContext *drag_context, 
 	gpointer		user_data)
 {
 	gwr_inf("View:signal_drag_begin");
@@ -588,7 +645,7 @@ gboolean GcmdGtkFoldview::View::context_menu_pop(ctx_menu_data *ctxdata)
 		if ( ctxdata->d_path_clicked )
 		{
 			if ( gtk_tree_path_compare(
-					ctxdata->d_path_clicked,
+					ctxdata->d_path_clicked, 
 					ctxdata->d_path_selected) == 0 )
 			{
 				ctxdata->a_foldview->control_context_menu_populate_add_section  (s_context_menu.a_widget, 0, ctxdata);
@@ -630,10 +687,10 @@ gboolean GcmdGtkFoldview::View::context_menu_pop(ctx_menu_data *ctxdata)
 	//	func				:	a user supplied function used to position the menu, or NULL. [allow-none]
 	//	data				:	user supplied data to be passed to func. [allow-none]
 	//	button				:	the mouse button which was pressed to initiate the event.
-	//	activate_time		:	the time at which the activation event occurred.
+	//	activate_time		:	the time at which the activation event occurred. 
 	gtk_menu_popup(
-		GTK_MENU(s_context_menu.a_widget), NULL, NULL,
-		NULL, NULL,
+		GTK_MENU(s_context_menu.a_widget), NULL, NULL, 
+		NULL, NULL, 
 		ctxdata->a_button, ctxdata->a_time);
 
 	return TRUE;
@@ -647,7 +704,7 @@ gboolean GcmdGtkFoldview::View::click_left_single(ctx_menu_data *ctxdata)
 	// simulate a callback, avoiding accessing to GcmdGtkFoldview singleton
 	GcmdGtkFoldview::Control_sync_update(NULL, ctxdata);
 
-	// tell gtk to continue signal treatment, else treeview wont
+	// tell gtk to continue signal treatment, else treeview wont 
 	// expand / collapse anymore if that was the arrow that was clicked
 	return FALSE;
 }
@@ -702,8 +759,8 @@ void GcmdGtkFoldview::View::update_style()
 	gtk_widget_set_style (GTK_WIDGET(treeview()), style_foldview);
 	((GnomeCmdCombo*)connection_combo())->update_style();
 }
-
-
+	
+	
 
 
 
diff --git a/src/gnome-cmd-foldview.cc b/src/gnome-cmd-foldview.cc
index 1bd57d6..93c0bb5 100644
--- a/src/gnome-cmd-foldview.cc
+++ b/src/gnome-cmd-foldview.cc
@@ -311,9 +311,27 @@ static void gcmdgtkfoldview_init                (GcmdGtkFoldview  		*ttt);
 
 static guint gcmdgtkfoldview_signals[LAST_SIGNAL] = { 0 };
 
+// GObject stuff - nothing to worry about
+static GObjectClass *parent_class = NULL;
 
 
 //-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+static void
+gnome_cmd_foldview_treestore_finalize(GObject *object)
+{
+	GcmdGtkFoldview *foldview  = NULL;
+	//......................................................................... 
+	g_return_if_fail ( IS_GCMDGTKFOLDVIEW(object) );
+	foldview = GCMDGTKFOLDVIEW(object);
+
+	g_assert(FALSE);
+
+	// must chain up - finalize parent
+	(* parent_class->finalize) (object);
+
+}
+//-----------------------------------------------------------------------------
 //	GcmdGtkFoldview GType implementation
 //-----------------------------------------------------------------------------
 GType
@@ -357,6 +375,16 @@ gcmdgtkfoldview_class_init (GcmdGtkFoldviewClass *klass)
 		NULL,
 		g_cclosure_marshal_VOID__VOID,
 		G_TYPE_NONE, 0);
+
+
+
+	// For exiting properly 
+	GObjectClass *object_class;
+
+	parent_class = (GObjectClass*) g_type_class_peek_parent (klass);
+	object_class = (GObjectClass*) klass;
+
+	object_class->finalize = gnome_cmd_foldview_treestore_finalize;
 }
 
 //-----------------------------------------------------------------------------



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]