Author: stephan
Date: 2006-10-03 14:45:40 +0000 (Tue, 03 Oct 2006)
New Revision: 23273

Added:
   xarchiver/branches/xarchiver-psybsd/src/archive_store.c
   xarchiver/branches/xarchiver-psybsd/src/archive_store.h
Modified:
   xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.c
   xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.h
   xarchiver/branches/xarchiver-psybsd/po/nl.po
   xarchiver/branches/xarchiver-psybsd/src/Makefile.am
   xarchiver/branches/xarchiver-psybsd/src/extract_dialog.h
   xarchiver/branches/xarchiver-psybsd/src/main_window.c
Log:
Speed up library, worked around bug,(probably introduced memory leaks).

But did some neat stuff.



Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.c  2006-10-03 
13:25:30 UTC (rev 23272)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.c  2006-10-03 
14:45:40 UTC (rev 23273)
@@ -31,7 +31,9 @@
 
 #include "internals.h"
 
+#define LXA_ENTRY_CHILD_BUFFER_SIZE 300
 
+
 static void
 lxa_archive_class_init(LXAArchiveClass *archive_class);
 
@@ -43,8 +45,13 @@
 
 void
 lxa_archive_free_entry(LXAEntry *entry, LXAArchive *archive);
+
+
 gint
-lxa_archive_lookup_tree_dir(gpointer key, gconstpointer filename);
+lxa_archive_sort_entry_buffer(LXAEntry *entry1, LXAEntry *entry2)
+{
+       return strcmp(entry1->filename, entry2->filename);
+}
 
 static gint lxa_archive_signals[1];
 
@@ -97,7 +104,7 @@
 lxa_archive_init(LXAArchive *archive)
 {
                archive->root_entry.filename = g_strdup("/");
-               archive->root_entry.children = 
g_tree_new((GCompareFunc)lxa_archive_lookup_tree_dir);
+               archive->root_entry.children = NULL;
 }
 
 static void
@@ -181,7 +188,7 @@
        gchar **path_items;
        LXAEntry *tmp_entry = NULL, *parent = NULL;
        path_items = g_strsplit_set(path, "/\n", -1);
-       tmp_entry = g_tree_lookup(archive->root_entry.children, path_items[0]);
+       tmp_entry = lxa_entry_get_child(&archive->root_entry, path_items[0]);
        if(!tmp_entry)
        {
                tmp_entry= g_new0(LXAEntry, 1);
@@ -190,23 +197,25 @@
                        tmp_entry->is_folder = TRUE;
                else
                        tmp_entry->is_folder = FALSE;
-               tmp_entry->children = 
g_tree_new((GCompareFunc)lxa_archive_lookup_tree_dir);
-               g_tree_insert(archive->root_entry.children, 
tmp_entry->filename, tmp_entry);
+               lxa_entry_add_child(&archive->root_entry, tmp_entry);
+               lxa_entry_flush_buffer(&archive->root_entry);
        }
        for(i = 1; path_items[i]?strlen(path_items[i]):0;i++)
        {
                parent = tmp_entry;
-               tmp_entry = g_tree_lookup(parent->children, path_items[i]);
+               tmp_entry = lxa_entry_get_child(parent, path_items[i]);
                if(!tmp_entry)
                {
                        tmp_entry = g_new0(LXAEntry, 1);
                        tmp_entry->filename = g_strdup(path_items[i]);
+                       lxa_entry_add_child(parent, tmp_entry);
                        if(path[strlen(path)-1] == '/')
+                       {
                                tmp_entry->is_folder = TRUE;
+                               lxa_entry_flush_buffer(parent);
+                       }
                        else
                                tmp_entry->is_folder = FALSE;
-                       tmp_entry->children = 
g_tree_new((GCompareFunc)lxa_archive_lookup_tree_dir);
-                       g_tree_insert(parent->children, tmp_entry->filename, 
tmp_entry);
                }
                parent = tmp_entry;
        }
@@ -214,11 +223,6 @@
        return tmp_entry;
 }
 
-LXAEntry *
-lxa_entry_get_child(LXAEntry *entry, const gchar *filename)
-{
-       return g_tree_lookup(entry->children, filename);
-}
 
 void
 lxa_archive_free_entry(LXAEntry *entry, LXAArchive *archive)
@@ -226,7 +230,9 @@
        gint i = 0; 
        gpointer props_iter = entry->props;
 
-       //g_slist_foreach(entry->children, (GFunc)lxa_archive_free_entry, 
archive);
+       for(i = 0; i < entry->n_children; i++)
+               lxa_archive_free_entry(entry->children[i], archive);
+
        if(entry->props)
        {
                switch(archive->column_types[i])
@@ -254,8 +260,111 @@
        return 0;
 }
 
-gint
-lxa_archive_lookup_tree_dir(gpointer key, gconstpointer filename)
+gboolean
+lxa_entry_add_child(LXAEntry *parent, LXAEntry *child)
 {
-       return strcmp(key, filename);
+       guint max_children = 0;
+       guint begin = 0;
+       guint pos = 0;
+       gint cmp = 0;
+       guint old_i = 0;
+       guint new_i = 0;
+       guint size = parent->n_children;
+       guint org_size = parent->n_children;
+       GSList *buffer_iter = NULL;
+       LXAEntry **children_old = (LXAEntry **)parent->children;
+       
+       parent->buffer = g_slist_insert_sorted(parent->buffer, (gpointer)child, 
(GCompareFunc)lxa_archive_sort_entry_buffer);
+       if(g_slist_length(parent->buffer) == LXA_ENTRY_CHILD_BUFFER_SIZE)
+               lxa_entry_flush_buffer(parent);
 }
+
+LXAEntry *
+lxa_entry_get_child(LXAEntry *entry, const gchar *filename)
+{
+       guint size = entry->n_children;
+       guint pos = 0;
+       gint cmp = 0;
+       while(size)
+       {
+               pos = (size / 2);
+
+               cmp = strcmp(filename, entry->children[pos]->filename);
+               if(!cmp)
+                       return entry->children[pos];
+
+               if(cmp < 0)
+               {
+                       size = pos;
+               }
+               else
+               {
+                       size = size - ++pos;
+               }
+       }
+       return NULL;
+}
+
+void
+lxa_entry_flush_buffer(LXAEntry *entry)
+{
+       g_debug("Flush");
+       guint max_children = 0;
+       guint begin = 0;
+       guint pos = 0;
+       gint cmp = 1;
+       guint old_i = 0;
+       guint new_i = 0;
+       guint size = entry->n_children;
+       GSList *buffer_iter = NULL;
+       LXAEntry **children_old = (LXAEntry **)entry->children;
+
+       max_children = (entry->n_children + g_slist_length(entry->buffer));
+       
+       entry->children = g_new(LXAEntry *, max_children);
+       for(buffer_iter = entry->buffer;buffer_iter;buffer_iter = 
buffer_iter->next)
+       {
+               size = entry->n_children - begin;
+               while(size)
+               {
+                       pos = (size / 2)+begin;
+
+                       cmp = strcmp(((LXAEntry *)buffer_iter->data)->filename, 
children_old[pos]->filename);
+                       if(!cmp)
+                               break;
+
+                       if(cmp < 0)
+                       {
+                               size = pos - begin;
+                       }
+                       else
+                       {
+                               size = size + begin - ++pos;
+                               begin = pos;
+                       }
+               }
+               if(!cmp)
+               {
+                       /* TODO: F*** (aka merge) */
+               }
+               else
+               {
+                       while(old_i < pos)
+                       {
+                               entry->children[new_i++] = 
children_old[old_i++];
+                       }
+                       entry->children[new_i++] = buffer_iter->data;
+               }
+       }
+       while(old_i < entry->n_children)
+       {
+               entry->children[new_i++] = children_old[old_i++];
+       }
+       entry->n_children = new_i;
+       g_debug("%d", entry->n_children);
+
+       g_slist_free(entry->buffer);
+       entry->buffer = NULL;
+
+       g_free(children_old);
+}

Modified: xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.h
===================================================================
--- xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.h  2006-10-03 
13:25:30 UTC (rev 23272)
+++ xarchiver/branches/xarchiver-psybsd/libxarchiver/archive.h  2006-10-03 
14:45:40 UTC (rev 23273)
@@ -31,12 +31,17 @@
        LXA_ARCHIVESTATUS_USERBREAK
 } LXAArchiveStatus;
 
-typedef struct {
+typedef struct _LXAEntry LXAEntry;
+
+struct _LXAEntry {
        gchar *filename;
-       GTree *children;
        gboolean is_folder;
        gpointer props;
-} LXAEntry;
+       /* */
+       LXAEntry **children;
+       guint   n_children;
+       GSList *buffer;
+};
 
 #define LXA_ARCHIVE(obj)         ( \
                G_TYPE_CHECK_INSTANCE_CAST ((obj),    \
@@ -98,6 +103,8 @@
 LXAEntry          *lxa_archive_add_file(LXAArchive *archive, gchar *path);
 GSList            *lxa_archive_get_children(LXAArchive *archive, gchar *path);
 LXAEntry          *lxa_entry_get_child(LXAEntry *, const gchar *);
+gboolean           lxa_entry_add_child(LXAEntry *parent, LXAEntry *child);
+void               lxa_entry_flush_buffer(LXAEntry *entry);
 
 
 G_END_DECLS

Modified: xarchiver/branches/xarchiver-psybsd/po/nl.po
===================================================================
--- xarchiver/branches/xarchiver-psybsd/po/nl.po        2006-10-03 13:25:30 UTC 
(rev 23272)
+++ xarchiver/branches/xarchiver-psybsd/po/nl.po        2006-10-03 14:45:40 UTC 
(rev 23273)
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: xarchiver 0.3.9psybsd\n"
 "Report-Msgid-Bugs-To: [EMAIL PROTECTED]"
-"POT-Creation-Date: 2006-09-25 00:02+0200\n"
+"POT-Creation-Date: 2006-10-02 09:14+0200\n"
 "PO-Revision-Date: 2006-07-20 16:36+0200\n"
 "Last-Translator: Stephan Arts <[EMAIL PROTECTED]>\n"
 "Language-Team: Dutch <[EMAIL PROTECTED]>\n"
@@ -16,12 +16,12 @@
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: ../libxarchiver/archive-support-gnu-tar.c:133
+#: ../libxarchiver/archive-support-gnu-tar.c:134
 #: ../libxarchiver/archive-support-zip.c:104
 msgid "Overwrite existing files"
 msgstr "Bestaande bestanden overschrijven"
 
-#: ../libxarchiver/archive-support-gnu-tar.c:134
+#: ../libxarchiver/archive-support-gnu-tar.c:135
 #: ../libxarchiver/archive-support-zip.c:105
 msgid "Overwrite existing files on extraction"
 msgstr "Bestaande bestanden overschrijven tijdens uitpakken"
@@ -47,11 +47,11 @@
 msgid "Version information"
 msgstr "Versie informatie"
 
-#: ../src/main.c:119
+#: ../src/main.c:120
 msgid "[archive name]"
 msgstr "[archief naam]"
 
-#: ../src/main.c:123
+#: ../src/main.c:124
 #, c-format
 msgid ""
 "%s: %s\n"
@@ -64,7 +64,7 @@
 #.
 #. * Could not create archive (mime type unsupported)
 #.
-#: ../src/main.c:196
+#: ../src/main.c:197
 msgid "Could not create archive, MIME-type unsupported"
 msgstr "Kan archief niet maken, MIME-type wordt niet ondersteund"
 
@@ -72,66 +72,70 @@
 #. * Could not open archive (mime type not supported or file did not exist)
 #. * Should be a more specific error message.
 #.
-#: ../src/main.c:213
+#: ../src/main.c:214
 msgid "Could not open archive, MIME-type unsupported or file did not exist"
 msgstr ""
 "Kan archief niet openen, MIME-type wordt niet ondersteund of bestand bestaat "
 "niet"
 
-#: ../src/main_window.c:101
+#: ../src/main_window.c:107 ../src/main_window.c:108
+msgid "Show icons"
+msgstr ""
+
+#: ../src/main_window.c:134
 msgid "_Archive"
 msgstr "_Archief"
 
-#: ../src/main_window.c:102
+#: ../src/main_window.c:135
 msgid "A_ction"
 msgstr "A_ctie"
 
-#: ../src/main_window.c:103
+#: ../src/main_window.c:136
 msgid "_Help"
 msgstr "_Help"
 
-#: ../src/main_window.c:147 ../src/main_window.c:191
+#: ../src/main_window.c:180 ../src/main_window.c:225
 msgid "Add"
 msgstr "Toevoegen"
 
-#: ../src/main_window.c:152 ../src/main_window.c:195
+#: ../src/main_window.c:185 ../src/main_window.c:229
 #: ../src/extract_dialog.c:99
 msgid "Extract"
 msgstr "Uitpakken"
 
-#: ../src/main_window.c:357
+#: ../src/main_window.c:455
 msgid "Open archive"
 msgstr "Archief openen"
 
-#: ../src/main_window.c:507
+#: ../src/main_window.c:632
 msgid "Initializing archive..."
 msgstr "Bezig met initialiseren van archief..."
 
-#: ../src/main_window.c:510
+#: ../src/main_window.c:635
 msgid "Reading archive contents..."
 msgstr "Bezig met lezen van archief..."
 
-#: ../src/main_window.c:513
+#: ../src/main_window.c:638
 msgid "Extracting archive..."
 msgstr "Archief uitpakken..."
 
-#: ../src/main_window.c:516
+#: ../src/main_window.c:641
 msgid "Adding file(s) to archive..."
 msgstr "Bestand(en) toevoegen aan archief..."
 
-#: ../src/main_window.c:519
+#: ../src/main_window.c:644
 msgid "Removing file(s) from archive..."
 msgstr "Bestand(en) toevoegen aan archief..."
 
-#: ../src/main_window.c:522
+#: ../src/main_window.c:647
 msgid "Error"
 msgstr "Fout"
 
-#: ../src/main_window.c:525
+#: ../src/main_window.c:650
 msgid "Cancelled"
 msgstr "Geannuleerd"
 
-#: ../src/main_window.c:528
+#: ../src/main_window.c:653
 msgid "Done"
 msgstr "Klaar"
 
@@ -139,14 +143,11 @@
 msgid "Create new archive"
 msgstr "Maak nieuw archief"
 
-#. * XA_ADD_DIALOG
-#. *  Frame title
-#.
-#: ../src/add_dialog.c:68
-msgid "Files and folders to add"
+#: ../src/add_dialog.c:64
+msgid "Drag Files and folders to bottom list"
 msgstr ""
 
-#: ../src/add_dialog.c:82
+#: ../src/add_dialog.c:91
 msgid "Add file(s) to archive"
 msgstr "Bestand(en) toevoegen aan archief"
 

Modified: xarchiver/branches/xarchiver-psybsd/src/Makefile.am
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/Makefile.am 2006-10-03 13:25:30 UTC 
(rev 23272)
+++ xarchiver/branches/xarchiver-psybsd/src/Makefile.am 2006-10-03 14:45:40 UTC 
(rev 23273)
@@ -5,6 +5,7 @@
        main_window.c main_window.h \
        new_dialog.c new_dialog.h \
        add_dialog.c add_dialog.h \
+       archive_store.c archive_store.h \
        preferences_dialog.c preferences_dialog.h \
        extract_dialog.c extract_dialog.h
 

Added: xarchiver/branches/xarchiver-psybsd/src/archive_store.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/archive_store.c                     
        (rev 0)
+++ xarchiver/branches/xarchiver-psybsd/src/archive_store.c     2006-10-03 
14:45:40 UTC (rev 23273)
@@ -0,0 +1,364 @@
+/*
+ *  Copyright (c) 2006 Stephan Arts <[EMAIL PROTECTED]>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+#include <glib.h>
+#include <gtk/gtk.h>
+#include <libxarchiver/libxarchiver.h>
+#include "archive_store.h"
+
+static void
+xa_archive_store_class_init(XAArchiveStoreClass *as_class);
+
+static void
+xa_archive_store_init(XAArchiveStore *as);
+
+static void
+xa_archive_tree_model_init(GtkTreeModelIface *tm_interface);
+
+static GtkTreeModelFlags
+xa_archive_store_get_flags(GtkTreeModel *tree_model);
+static gint
+xa_archive_store_get_n_columns(GtkTreeModel *tree_model);
+static GType
+xa_archive_store_get_column_type(GtkTreeModel *tree_model, gint index);
+static gboolean
+xa_archive_store_get_iter(GtkTreeModel *tree_model, GtkTreeIter *iter, 
GtkTreePath *path);
+static GtkTreePath *
+xa_archive_store_get_path (GtkTreeModel *tree_model, GtkTreeIter *iter);
+static void 
+xa_archive_store_get_value (GtkTreeModel *tree_model, GtkTreeIter *iter, gint 
column, GValue *value);
+static gboolean
+xa_archive_store_iter_next (GtkTreeModel *tree_model, GtkTreeIter *iter);
+static gboolean
+xa_archive_store_iter_children (GtkTreeModel *tree_model, GtkTreeIter *iter, 
GtkTreeIter *parent);
+static gboolean
+xa_archive_store_iter_has_child (GtkTreeModel *tree_model, GtkTreeIter *iter);
+static gint
+xa_archive_store_iter_n_children (GtkTreeModel *tree_model, GtkTreeIter *iter);
+static gboolean 
+xa_archive_store_iter_nth_child (GtkTreeModel *tree_model, GtkTreeIter *iter, 
GtkTreeIter *parent, gint n);
+static gboolean
+xa_archive_store_iter_parent (GtkTreeModel *tree_model, GtkTreeIter *iter, 
GtkTreeIter *child);
+
+GType
+xa_archive_store_get_type()
+{
+       static GType xa_archive_store_type= 0;
+
+       if(xa_archive_store_type)
+               return xa_archive_store_type;
+
+       if (!xa_archive_store_type)
+       {
+               static const GTypeInfo xa_archive_store_info = 
+               {
+                       sizeof (XAArchiveStoreClass),
+                       (GBaseInitFunc) NULL,
+                       (GBaseFinalizeFunc) NULL,
+                       (GClassInitFunc) xa_archive_store_class_init,
+                       (GClassFinalizeFunc) NULL,
+                       NULL,
+                       sizeof (XAArchiveStore),
+                       0,
+                       (GInstanceInitFunc) xa_archive_store_init,
+                       NULL
+               };
+
+               xa_archive_store_type = g_type_register_static (G_TYPE_OBJECT, 
"XAArchiveStore", &xa_archive_store_info, 0);
+       }
+       static const GInterfaceInfo tree_model_info =
+       {
+               (GInterfaceInitFunc) xa_archive_tree_model_init,
+                       NULL,
+                       NULL
+       };
+
+       g_type_add_interface_static (xa_archive_store_type, 
GTK_TYPE_TREE_MODEL, &tree_model_info);
+       return xa_archive_store_type;
+}
+
+static void
+xa_archive_tree_model_init(GtkTreeModelIface *iface)
+{
+       iface->get_flags       = xa_archive_store_get_flags;
+       iface->get_n_columns   = xa_archive_store_get_n_columns;
+  iface->get_column_type = xa_archive_store_get_column_type;
+  iface->get_iter        = xa_archive_store_get_iter;
+  iface->get_path        = xa_archive_store_get_path;
+  iface->get_value       = xa_archive_store_get_value;
+  iface->iter_next       = xa_archive_store_iter_next;
+  iface->iter_children   = xa_archive_store_iter_children;
+  iface->iter_has_child  = xa_archive_store_iter_has_child;
+  iface->iter_n_children = xa_archive_store_iter_n_children;
+  iface->iter_nth_child  = xa_archive_store_iter_nth_child;
+  iface->iter_parent     = xa_archive_store_iter_parent;
+}
+
+static void
+xa_archive_store_init(XAArchiveStore *as)
+{
+       as->stamp = g_random_int();
+}
+
+static void
+xa_archive_store_class_init(XAArchiveStoreClass *as_class)
+{
+
+}
+
+
+static gboolean
+xa_archive_store_get_iter(GtkTreeModel *tree_model, GtkTreeIter *iter, 
GtkTreePath *path)
+{
+       XAArchiveStore *store = XA_ARCHIVE_STORE(tree_model);
+
+  gint *indices = gtk_tree_path_get_indices(path);
+
+       if(indices[0] >= g_slist_length(store->rows) || indices[0] < 0)
+               return FALSE;
+
+       GSList *entry = g_slist_nth(store->rows, indices[0]);
+       if(!entry)
+               return FALSE;
+
+       iter->stamp = store->stamp;
+       iter->user_data = entry;
+       iter->user_data2 = NULL;
+       iter->user_data3 = NULL;
+       return TRUE;
+}
+
+static GtkTreePath *
+xa_archive_store_get_path (GtkTreeModel *tree_model, GtkTreeIter *iter)
+{
+       GtkTreePath *path = NULL;
+       XAArchiveStore *store = XA_ARCHIVE_STORE(tree_model);
+       GSList *list = g_slist_find(store->rows, iter->user_data);
+       if(list)
+       {
+               path = gtk_tree_path_new();
+               gtk_tree_path_append_index(path, g_slist_position(store->rows, 
list));
+       }
+       return path;
+}
+
+
+static gboolean 
+xa_archive_store_iter_nth_child (GtkTreeModel *tree_model, GtkTreeIter *iter, 
GtkTreeIter *parent, gint n)
+{
+       XAArchiveStore *store = XA_ARCHIVE_STORE(tree_model);
+       LXAEntry *entry = g_slist_nth_data(store->rows, n);
+       if(!entry)
+               return FALSE;
+       iter->stamp = store->stamp;
+       iter->user_data = entry;
+       return FALSE;
+}
+
+
+/* done */
+
+static void 
+xa_archive_store_get_value (GtkTreeModel *tree_model, GtkTreeIter *iter, gint 
column, GValue *value)
+{
+       guint i = 0;
+       g_return_if_fail (XA_IS_ARCHIVE_STORE (tree_model));
+       g_return_if_fail (iter != NULL);
+       g_return_if_fail (column < XA_ARCHIVE_STORE(tree_model)->n_columns);
+
+       g_value_init(value, XA_ARCHIVE_STORE(tree_model)->column_types[column]);
+
+       XAArchiveStore *archive_store = XA_ARCHIVE_STORE(tree_model);
+
+       LXAEntry *entry = ((GSList *)iter->user_data)->data;
+       gpointer props_iter = entry->props;
+
+       if((column == 1 && archive_store->props._show_icons) || (column == 0))
+       {
+               if(archive_store->props._show_icons && column == 0)
+                       g_value_set_string(value, "unknown");
+               else
+                       g_value_set_string(value, entry->filename);
+       } else
+       {
+               if(archive_store->props._show_icons)
+                       i = 2;
+               else
+                       i = 1;
+               for(;i<column;i++)
+               {
+                       switch(archive_store->column_types[i])
+                       {
+                               case G_TYPE_STRING:
+                                       props_iter+=sizeof(gchar *);
+                                       break;
+                               case G_TYPE_UINT64:
+                                       props_iter+=sizeof(guint64);
+                                       break;
+                               case G_TYPE_UINT:
+                                       props_iter+=sizeof(guint);
+                                       break;
+                       }
+               }
+               switch(archive_store->column_types[column])
+               {
+                       case G_TYPE_STRING:
+                               g_value_set_string(value, *(gchar 
**)props_iter);
+                               break;
+                       case G_TYPE_UINT64:
+                               g_value_set_uint64(value, *(guint64 
*)props_iter);
+                               break;
+                       case G_TYPE_UINT:
+                               g_value_set_uint(value, *(guint *)props_iter);
+                               break;
+               }
+       }
+}
+
+static gboolean
+xa_archive_store_iter_next (GtkTreeModel *tree_model, GtkTreeIter *iter)
+{
+       g_return_val_if_fail(XA_IS_ARCHIVE_STORE(tree_model), FALSE);
+       if(iter == NULL || iter->user_data == NULL)
+               return FALSE;
+       
+       if(!((GSList *)iter->user_data)->next)
+               return FALSE;
+       
+       iter->stamp = XA_ARCHIVE_STORE(tree_model)->stamp;
+       iter->user_data = ((GSList *)iter->user_data)->next;
+       return TRUE;
+}
+
+static gboolean
+xa_archive_store_iter_parent (GtkTreeModel *tree_model, GtkTreeIter *iter, 
GtkTreeIter *child)
+{
+       return FALSE;
+}
+
+
+static gboolean
+xa_archive_store_iter_children (GtkTreeModel *tree_model, GtkTreeIter *iter, 
GtkTreeIter *parent)
+{
+       g_return_val_if_fail(parent == NULL || parent->user_data == NULL, 
FALSE);
+       g_return_val_if_fail(XA_IS_ARCHIVE_STORE(tree_model), FALSE);
+       XAArchiveStore *archive_store = XA_ARCHIVE_STORE(tree_model);
+       
+       if(g_slist_length(archive_store->rows) == 0)
+               return FALSE;
+       
+       iter->stamp = archive_store->stamp;
+       iter->user_data = archive_store->rows;
+
+       return TRUE;
+}
+
+static gboolean
+xa_archive_store_iter_has_child (GtkTreeModel *tree_model, GtkTreeIter *iter)
+{
+       return FALSE;
+}
+
+static GType
+xa_archive_store_get_column_type(GtkTreeModel *tree_model, gint index)
+{
+       g_return_val_if_fail(XA_IS_ARCHIVE_STORE(tree_model), G_TYPE_INVALID);  
+       return XA_ARCHIVE_STORE(tree_model)->column_types[index];
+}
+
+static gint
+xa_archive_store_get_n_columns(GtkTreeModel *tree_model)
+{
+       g_return_val_if_fail(XA_IS_ARCHIVE_STORE(tree_model), 0);
+       
+       return XA_ARCHIVE_STORE(tree_model)->n_columns;
+}
+
+static GtkTreeModelFlags
+xa_archive_store_get_flags(GtkTreeModel *tree_model)
+{
+       g_return_val_if_fail(XA_IS_ARCHIVE_STORE(tree_model), 
(GtkTreeModelFlags)0);
+
+  return (GTK_TREE_MODEL_LIST_ONLY | GTK_TREE_MODEL_ITERS_PERSIST);
+}
+
+static gint
+xa_archive_store_iter_n_children (GtkTreeModel *tree_model, GtkTreeIter *iter)
+{
+       g_return_val_if_fail(XA_IS_ARCHIVE_STORE(tree_model), -1);
+       g_return_val_if_fail(iter == NULL || iter->user_data != NULL, 0);
+
+       XAArchiveStore *archive_store = XA_ARCHIVE_STORE(tree_model);
+
+       return g_slist_length(archive_store->rows);
+}
+
+GtkTreeModel *
+xa_archive_store_new(LXAArchive *archive, gboolean show_icons)
+{
+       XAArchiveStore *tree_model;
+       GType *column_types;
+       gint x;
+
+       tree_model = g_object_new(XA_TYPE_ARCHIVE_STORE, NULL);
+       if(show_icons)
+       {
+               column_types = g_new0(GType, archive->column_number+1);
+               for(x = 0; x < archive->column_number; x++)
+               {
+                       column_types[x+1] = archive->column_types[x];
+               }
+               column_types[0] = G_TYPE_STRING;
+               tree_model->n_columns = archive->column_number + 1;
+       }
+       else
+       {
+               column_types = g_new0(GType, archive->column_number);
+               for(x = 0; x < archive->column_number; x++)
+               {
+                       column_types[x] = archive->column_types[x];
+               }
+               tree_model->n_columns = archive->column_number;
+       }
+       tree_model->column_types = archive->column_types;
+       tree_model->props._show_icons = show_icons;
+
+
+       return GTK_TREE_MODEL(tree_model);
+}
+
+gboolean
+xa_archive_store_add_item(gpointer key, gpointer value, gpointer data)
+{
+//     GtkTreeIter iter;
+       XA_ARCHIVE_STORE(data)->rows = 
g_slist_prepend(XA_ARCHIVE_STORE(data)->rows, value);
+       GtkTreePath *path = gtk_tree_path_new();
+       gtk_tree_path_append_index(path, 0);
+
+//     xa_archive_store_get_iter(GTK_TREE_MODEL(data), &iter, path);
+//     gtk_tree_model_row_inserted(GTK_TREE_MODEL(data), path, &iter);
+       gtk_tree_path_free(path);
+       return FALSE;
+}
+
+void
+xa_archive_store_set_contents(XAArchiveStore *archive_store, GTree *items, 
gboolean is_root)
+{
+       g_tree_foreach(items, (GTraverseFunc)xa_archive_store_add_item, 
archive_store);
+}

Added: xarchiver/branches/xarchiver-psybsd/src/archive_store.h
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/archive_store.h                     
        (rev 0)
+++ xarchiver/branches/xarchiver-psybsd/src/archive_store.h     2006-10-03 
14:45:40 UTC (rev 23273)
@@ -0,0 +1,70 @@
+/*
+ *  Copyright (c) 2006 Stephan Arts <[EMAIL PROTECTED]>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+#ifndef __XARCHIVER_ARCHIVE_STORE_H__
+#define __XARCHIVER_ARCHIVE_STORE_H__
+
+#define XA_TYPE_ARCHIVE_STORE xa_archive_store_get_type()
+
+#define XA_ARCHIVE_STORE(obj)         ( \
+               G_TYPE_CHECK_INSTANCE_CAST ((obj),    \
+                       XA_TYPE_ARCHIVE_STORE,      \
+                       XAArchiveStore))
+
+#define XA_IS_ARCHIVE_STORE(obj)      ( \
+               G_TYPE_CHECK_INSTANCE_TYPE ((obj),    \
+                       XA_TYPE_ARCHIVE_STORE))
+
+#define XA_ARCHIVE_STORE_CLASS(class) ( \
+               G_TYPE_CHECK_CLASS_CAST ((class),     \
+                       XA_TYPE_ARCHIVE_STORE,      \
+                       XAArchiveStoreClass))
+
+#define XA_IS_ARCHIVE_STORE_CLASS(class) ( \
+               G_TYPE_CHECK_CLASS_TYPE ((class),        \
+                       XA_TYPE_ARCHIVE_STORE))
+
+typedef struct _XAArchiveStore XAArchiveStore;
+
+struct _XAArchiveStore
+{
+       GObject parent;
+       gint stamp;
+       guint n_columns;
+       GType *column_types;
+       GSList *rows;
+       struct {
+               gboolean _show_icons;
+       } props;
+};
+
+typedef struct _XAArchiveStoreClass XAArchiveStoreClass;
+
+struct _XAArchiveStoreClass
+{
+       GObjectClass parent_class;
+};
+
+
+GType
+xa_archive_store_get_type();
+GtkTreeModel *
+xa_archive_store_new(LXAArchive *archive, gboolean show_icons);
+void
+xa_archive_store_set_contents(XAArchiveStore *archive_store, GTree *items, 
gboolean is_root);
+
+#endif /* __XARCHIVER_ARCHIVE_STORE_H__ */

Modified: xarchiver/branches/xarchiver-psybsd/src/extract_dialog.h
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/extract_dialog.h    2006-10-03 
13:25:30 UTC (rev 23272)
+++ xarchiver/branches/xarchiver-psybsd/src/extract_dialog.h    2006-10-03 
14:45:40 UTC (rev 23273)
@@ -58,6 +58,7 @@
        GtkFileChooserDialogClass parent_class;
 };
 
+GType      xa_extract_archive_dialog_get_type();
 GtkWidget *xa_extract_archive_dialog_new(LXAArchiveSupport *, LXAArchive *, 
gboolean);
 
 G_END_DECLS

Modified: xarchiver/branches/xarchiver-psybsd/src/main_window.c
===================================================================
--- xarchiver/branches/xarchiver-psybsd/src/main_window.c       2006-10-03 
13:25:30 UTC (rev 23272)
+++ xarchiver/branches/xarchiver-psybsd/src/main_window.c       2006-10-03 
14:45:40 UTC (rev 23273)
@@ -30,6 +30,7 @@
 #include "extract_dialog.h"
 #include "add_dialog.h"
 #include "preferences_dialog.h"
+#include "archive_store.h"
 
 #include "main.h"
 
@@ -48,9 +49,9 @@
 static void
 cb_xa_main_window_style_set(XAMainWindow *window, gpointer userdata);
 gboolean
-xa_main_window_add_item(gpointer key, gpointer value, gpointer data);
+xa_main_window_add_item(LXAEntry *entry, gpointer data);
 void 
-xa_main_window_set_contents(XAMainWindow *, LXAArchive *, GTree *);
+xa_main_window_set_contents(XAMainWindow *, LXAArchive *);
 
 void
 xa_main_window_reset_columns(XAMainWindow *window);
@@ -328,20 +329,18 @@
 static void
 cb_xa_main_window_style_set(XAMainWindow *window, gpointer userdata)
 {
-       GTree *items = NULL;
-
-       if(window->working_node)
-               items = ((LXAEntry *)window->working_node->data)->children;
-
        if(!(gtk_icon_theme_has_icon(window->icon_theme, "folder") && 
gtk_icon_theme_has_icon(window->icon_theme, "unknown") && 
gtk_icon_theme_has_icon(window->icon_theme, "go-up")))
                window->props._show_icons = FALSE;
        else
                window->props._show_icons = TRUE;
 
-       if(items)
+       if(window->working_node)
        {
-               xa_main_window_reset_columns(window);
-               xa_main_window_set_contents(window, window->lp_xa_archive, 
items);
+               if(((LXAEntry *)window->working_node->data)->children)
+               {
+                       xa_main_window_reset_columns(window);
+                       xa_main_window_set_contents(window, 
window->lp_xa_archive);
+               }
        }
        
 }
@@ -659,7 +658,7 @@
                                        
xa_main_window_reset_columns(main_window);
 
                                        main_window->working_node = 
g_slist_prepend(main_window->working_node, &(archive->root_entry));
-                                       
xa_main_window_set_contents(main_window, archive, archive->root_entry.children);
+                                       
xa_main_window_set_contents(main_window, archive);
                                case(LXA_ARCHIVESTATUS_EXTRACT):
                                        
gtk_widget_set_sensitive(GTK_WIDGET(main_window->menubar.menu_item_add), TRUE);
                                        
gtk_widget_set_sensitive(GTK_WIDGET(main_window->menubar.menu_item_remove), 
TRUE);
@@ -710,6 +709,7 @@
        GtkCellRenderer *renderer = NULL;
        GtkTreeViewColumn *column = NULL;
        GtkListStore *liststore = NULL;
+       //GtkTreeModel *liststore = NULL;
        LXAArchive *archive = window->lp_xa_archive;
        gint x = 0;
        GList *columns = 
gtk_tree_view_get_columns(GTK_TREE_VIEW(window->treeview));
@@ -729,6 +729,7 @@
                }
                column_types[0] = G_TYPE_STRING;
                liststore = gtk_list_store_newv(archive->column_number+1, 
column_types); 
+//             liststore = xa_archive_store_new(archive, TRUE);
 
                renderer = gtk_cell_renderer_pixbuf_new();
                column = gtk_tree_view_column_new_with_attributes("", renderer, 
"icon-name", 0, NULL);
@@ -753,6 +754,7 @@
        } else
        {
                liststore = gtk_list_store_newv(archive->column_number, 
archive->column_types); 
+               //liststore = xa_archive_store_new(archive, FALSE);
                for(x = 0; x < archive->column_number; x++)
                {
                        switch(archive->column_types[x])
@@ -774,9 +776,9 @@
 }
 
 void
-xa_main_window_set_contents(XAMainWindow *main_window, LXAArchive *archive, 
GTree *item_tree)
+xa_main_window_set_contents(XAMainWindow *main_window, LXAArchive *archive)
 {
-       gint i = 0;
+       guint i = 0;
        GtkTreeModel *liststore = main_window->treemodel;
        g_object_ref(liststore);
        GtkTreeIter iter;
@@ -786,9 +788,13 @@
 
        gtk_list_store_clear(GTK_LIST_STORE(liststore));
 
+       lxa_entry_flush_buffer(((LXAEntry *)main_window->working_node->data));
 
-       g_tree_foreach(item_tree, (GTraverseFunc)xa_main_window_add_item, 
main_window);
+       for(i=0;i<((LXAEntry *)main_window->working_node->data)->n_children; 
i++)
+               xa_main_window_add_item(((LXAEntry 
*)main_window->working_node->data)->children[i], main_window);
 
+       g_debug("Nodes: %d\n", ((LXAEntry 
*)main_window->working_node->data)->n_children);
+
        if(g_slist_length(main_window->working_node) > 1)
        {
                gtk_list_store_prepend(GTK_LIST_STORE(liststore), &iter);
@@ -803,18 +809,23 @@
                else
                        gtk_list_store_set_value(GTK_LIST_STORE(liststore), 
&iter, 0, main_window->parent_node);
        }
+/*
+       if(g_slist_length(main_window->working_node) > 1)
+               xa_archive_store_set_contents(XA_ARCHIVE_STORE(liststore), 
item_tree, FALSE);
+       else
+               xa_archive_store_set_contents(XA_ARCHIVE_STORE(liststore), 
item_tree, TRUE);
+*/
        gtk_tree_view_set_model(GTK_TREE_VIEW(main_window->treeview), 
GTK_TREE_MODEL(liststore));
 }
 
 gboolean
-xa_main_window_add_item(gpointer key, gpointer value, gpointer data)
+xa_main_window_add_item(LXAEntry *entry, gpointer data)
 {
        gint i = 0;
        GtkTreeIter iter;
        gpointer props;
        gpointer props_iter;
        GValue *tmp_value;
-       gint column_number;
        XAMainWindow *main_window= XA_MAIN_WINDOW(data);
        GtkTreeModel *liststore = main_window->treemodel;
        gtk_list_store_append(GTK_LIST_STORE(liststore), &iter);
@@ -822,7 +833,7 @@
        {
                tmp_value = g_new0(GValue, 1);
                tmp_value = g_value_init(tmp_value, G_TYPE_STRING);
-               if(((LXAEntry*)value)->is_folder)
+               if(entry->is_folder)
                        g_value_set_string(tmp_value, "folder");
                else
                        g_value_set_string(tmp_value, "unknown");
@@ -833,12 +844,12 @@
        }
        tmp_value = g_new0(GValue, 1);
        tmp_value = g_value_init(tmp_value, G_TYPE_STRING);
-       g_value_set_string(tmp_value, (gchar *)key);
+       g_value_set_string(tmp_value, entry->filename);
        gtk_list_store_set_value(GTK_LIST_STORE(liststore), &iter, i, 
tmp_value);
        g_value_unset(tmp_value);
        g_free(tmp_value);
 
-       props = ((LXAEntry *)value)->props;
+       props = entry->props;
        if(props)
        {
                props_iter = props;
@@ -875,12 +886,10 @@
 
 
 
-
 void
 cb_xa_main_item_activated(GtkTreeView *treeview, GtkTreePath *treepath, 
GtkTreeViewColumn *column, gpointer userdata)
 {
        GtkTreeIter iter;
-       GTree *items = NULL;
        GValue *value = g_new0(GValue, 1);
        XAMainWindow *main_window = userdata;
 
@@ -893,11 +902,10 @@
                gtk_tree_model_get_value(tree_model, &iter, 0, value);
 
        const gchar *item_filename = (gchar *)g_value_get_string(value);
-       if(!strcmp(item_filename, "..")) /* pop */
+       if(!strcmp(item_filename, ".."))
        {
                main_window->working_node = 
g_slist_delete_link(main_window->working_node, main_window->working_node);
-               items = ((LXAEntry *)main_window->working_node->data)->children;
-               xa_main_window_set_contents(main_window, 
main_window->lp_xa_archive, items);
+               xa_main_window_set_contents(main_window, 
main_window->lp_xa_archive);
        }
        else
        {
@@ -907,8 +915,7 @@
                        if(entry->is_folder)
                        {
                                main_window->working_node = 
g_slist_prepend(main_window->working_node, entry);
-                               items = ((LXAEntry 
*)main_window->working_node->data)->children;
-                               xa_main_window_set_contents(main_window, 
main_window->lp_xa_archive, items);
+                               xa_main_window_set_contents(main_window, 
main_window->lp_xa_archive);
                        }
                        else
                        { 

_______________________________________________
Xfce4-commits mailing list
Xfce4-commits@xfce.org
http://foo-projects.org/mailman/listinfo/xfce4-commits

Reply via email to