[gnome-commander/treeview] treeview: the valgrind release
- From: Piotr Eljasiak <epiotr src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-commander/treeview] treeview: the valgrind release
- Date: Fri, 13 Aug 2010 20:52:06 +0000 (UTC)
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]