Author: colossus
Date: 2008-07-19 12:56:56 +0000 (Sat, 19 Jul 2008)
New Revision: 27351

Modified:
   xarchiver/trunk/TODO
   xarchiver/trunk/src/add_dialog.c
   xarchiver/trunk/src/archive.c
   xarchiver/trunk/src/arj.c
   xarchiver/trunk/src/extract_dialog.c
   xarchiver/trunk/src/interface.c
   xarchiver/trunk/src/interface.h
   xarchiver/trunk/src/main.c
   xarchiver/trunk/src/rpm.c
   xarchiver/trunk/src/window.c
   xarchiver/trunk/src/window.h
Log:
Fixed the recursing bug when adding with 7z.
Enriched the status bar and changed the progress to a green/red flashing light.
Removed the question asking whether to see the archiver error message.
Updated TODO file.


Modified: xarchiver/trunk/TODO
===================================================================
--- xarchiver/trunk/TODO        2008-07-19 06:47:03 UTC (rev 27350)
+++ xarchiver/trunk/TODO        2008-07-19 12:56:56 UTC (rev 27351)
@@ -8,4 +8,3 @@
 - support tar on *BSD.
 - avoid reset of extract dialog options when loading a new archive.
 - ability to create sfx archives through the Add dialog for those archives 
which support it.
-- have two real status bars with displayed number of dirs.

Modified: xarchiver/trunk/src/add_dialog.c
===================================================================
--- xarchiver/trunk/src/add_dialog.c    2008-07-19 06:47:03 UTC (rev 27350)
+++ xarchiver/trunk/src/add_dialog.c    2008-07-19 12:56:56 UTC (rev 27351)
@@ -420,7 +420,6 @@
 
        if (xa_main_window)
        {
-               Update_StatusBar (_("Adding files to the archive, please 
wait..."));
                /* This in case the user wants to add files in the archive 
directories */
                if (archive->location_entry_path != NULL)
                {

Modified: xarchiver/trunk/src/archive.c
===================================================================
--- xarchiver/trunk/src/archive.c       2008-07-19 06:47:03 UTC (rev 27350)
+++ xarchiver/trunk/src/archive.c       2008-07-19 12:56:56 UTC (rev 27351)
@@ -81,7 +81,7 @@
        g_strfreev ( argv );
 
        if (archive->pb_source == 0)
-               archive->pb_source = g_timeout_add (200, xa_progressbar_pulse, 
NULL );
+               archive->pb_source = g_timeout_add 
(350,xa_flash_led_indicator,archive);
 
        if (archive->error_output != NULL)
        {
@@ -211,8 +211,6 @@
        if (archive->tmp != NULL)
        {
                xa_delete_temp_directory (archive,0);
-               if(xa_main_window)
-                       gtk_widget_hide(viewport2);
                g_free (archive->tmp);
                archive->tmp = NULL;
        }
@@ -331,7 +329,6 @@
        else
        {
                archive->parse_output = 0;
-               gtk_widget_show (viewport2);
                gtk_widget_set_sensitive (Stop_button,TRUE);
                while (_commands)
                {
@@ -776,7 +773,7 @@
                g_string_free(string,TRUE);
 
                xa_update_window_with_archive_entries(archive[idx],entry);
-               xa_handle_selected_rows(NULL,archive[idx]);
+               xa_set_statusbar_message_for_displayed_rows(archive[idx]);
        }
 }
 

Modified: xarchiver/trunk/src/arj.c
===================================================================
--- xarchiver/trunk/src/arj.c   2008-07-19 06:47:03 UTC (rev 27350)
+++ xarchiver/trunk/src/arj.c   2008-07-19 12:56:56 UTC (rev 27351)
@@ -262,7 +262,7 @@
        if (archive->passwd != NULL)
                command = g_strconcat ("arj t -g" , archive->passwd , " -i " , 
archive->escaped_path, NULL);
        else
-               command = g_strconcat ("arj t -i " , archive->escaped_path, 
NULL);
+               command = g_strconcat ("arj t -i -y - " , 
archive->escaped_path, NULL);
 
        list = g_slist_append(list,command);
        xa_run_command (archive,list);

Modified: xarchiver/trunk/src/extract_dialog.c
===================================================================
--- xarchiver/trunk/src/extract_dialog.c        2008-07-19 06:47:03 UTC (rev 
27350)
+++ xarchiver/trunk/src/extract_dialog.c        2008-07-19 12:56:56 UTC (rev 
27351)
@@ -19,7 +19,6 @@
 #include <gtk/gtk.h>
 #include <stdlib.h>
 #include "extract_dialog.h"
-#include "interface.h"
 #include "window.h"
 #include "string_utils.h"
 #include "support.h"
@@ -399,8 +398,6 @@
                        if (xa_main_window && (archive->type == 
XARCHIVETYPE_GZIP || archive->type == XARCHIVETYPE_LZMA || archive->type == 
XARCHIVETYPE_BZIP2) )
                        {
                                gtk_widget_set_sensitive (Stop_button,FALSE);
-                               Update_StatusBar (_("Operation canceled."));
-                               gtk_widget_hide (viewport2);
                                xa_set_button_state 
(1,1,GTK_WIDGET_IS_SENSITIVE(save1),GTK_WIDGET_IS_SENSITIVE(close1),0,0,0,0,0);
                                archive->status = XA_ARCHIVESTATUS_IDLE;
                        }
@@ -456,12 +453,7 @@
                        if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON 
(dialog_data->files_radio)))
                        {
                                if (xa_main_window)
-                               {
-                                       gchar *text = 
g_strdup_printf(_("Extracting files to %s"),destination_path);
-                                       Update_StatusBar ( text );
                                        gtk_widget_set_sensitive 
(Stop_button,TRUE);
-                                       g_free (text);
-                               }
                        }
                        else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON 
(dialog_data->selected_radio)))
                                
gtk_tree_selection_selected_foreach(selection,(GtkTreeSelectionForeachFunc) 
xa_concat_filenames,&names);

Modified: xarchiver/trunk/src/interface.c
===================================================================
--- xarchiver/trunk/src/interface.c     2008-07-19 06:47:03 UTC (rev 27350)
+++ xarchiver/trunk/src/interface.c     2008-07-19 12:56:56 UTC (rev 27351)
@@ -441,25 +441,44 @@
        gtk_widget_show (hbox_sb);
        gtk_box_pack_end (GTK_BOX (vbox1), hbox_sb, FALSE, TRUE,0);
 
-       viewport1 = gtk_viewport_new (NULL, NULL);
-       gtk_viewport_set_shadow_type(GTK_VIEWPORT(viewport1),GTK_SHADOW_NONE);
-       gtk_widget_show (viewport1);
-       gtk_box_pack_start (GTK_BOX (hbox_sb), viewport1, TRUE, TRUE, 0);
-
-       info_label = gtk_label_new (NULL);
-       gtk_misc_set_alignment (GTK_MISC(info_label), 0.0, 0.5);
-       gtk_widget_show (info_label);
-       gtk_container_add (GTK_CONTAINER (viewport1), info_label);
-
-       viewport2 = gtk_viewport_new (NULL, NULL);
-       gtk_viewport_set_shadow_type(GTK_VIEWPORT(viewport2),GTK_SHADOW_NONE);
-       gtk_box_pack_start (GTK_BOX (hbox_sb), viewport2, TRUE, TRUE, 0);
-
+       /*
        progressbar = gtk_progress_bar_new ();
        gtk_widget_show (progressbar);
        gtk_widget_set_size_request(progressbar,-1,10);
-       gtk_container_add (GTK_CONTAINER (viewport2), progressbar);
+       gtk_container_add (GTK_CONTAINER (viewport2), progressbar);*/
+       
+       frame1 = gtk_frame_new (NULL);
+       gtk_widget_show (frame1);
+       gtk_box_pack_start (GTK_BOX (hbox_sb), frame1, TRUE, TRUE, 0);
+       gtk_frame_set_label_align (GTK_FRAME (frame1), 0, 0);
+       gtk_frame_set_shadow_type (GTK_FRAME (frame1), GTK_SHADOW_IN);
 
+       total_label = gtk_label_new (NULL);
+       gtk_misc_set_alignment (GTK_MISC(total_label), 0.0, 0.5);
+       gtk_widget_show (total_label);
+       gtk_container_add (GTK_CONTAINER (frame1), total_label);
+       
+       frame2 = gtk_frame_new (NULL);
+       gtk_widget_show (frame2);
+       gtk_box_pack_start (GTK_BOX (hbox_sb), frame2, TRUE, TRUE, 0);
+       gtk_frame_set_label_align (GTK_FRAME (frame2), 0, 0);
+       gtk_frame_set_shadow_type (GTK_FRAME (frame2), GTK_SHADOW_IN);
+
+       selected_label = gtk_label_new (NULL);
+       gtk_misc_set_alignment (GTK_MISC(selected_label), 0.0, 0.5);
+       gtk_widget_show (selected_label);
+       gtk_container_add (GTK_CONTAINER (frame2), selected_label);
+       
+       green_led = gtk_image_new_from_icon_name ("gtk-yes", 
GTK_ICON_SIZE_BUTTON);
+       gtk_widget_show (green_led);
+       gtk_box_pack_start (GTK_BOX (hbox_sb), green_led, FALSE, FALSE, 0);
+       gtk_misc_set_alignment (GTK_MISC (green_led), 1, 1);
+       gtk_tooltips_set_tip (tooltips,green_led, _("This is Xarchiver led 
status indicator. When the red light is on Xarchiver is busy"), NULL);
+
+       red_led = gtk_image_new_from_icon_name ("gtk-no", GTK_ICON_SIZE_BUTTON);
+       gtk_box_pack_start (GTK_BOX (hbox_sb),red_led,FALSE, FALSE, 0);
+       gtk_misc_set_alignment (GTK_MISC (red_led),1,1);
+
        g_signal_connect ((gpointer) new1, "activate", G_CALLBACK 
(xa_new_archive), NULL);
        g_signal_connect ((gpointer) open1, "activate", G_CALLBACK 
(xa_open_archive), NULL);
        g_signal_connect ((gpointer) save1, "activate", G_CALLBACK 
(xa_save_archive), NULL);
@@ -497,14 +516,27 @@
        gtk_window_add_accel_group (GTK_WINDOW (xa_main_window), accel_group);
 }
 
-int xa_progressbar_pulse (gpointer data)
+int xa_flash_led_indicator (gpointer data)
 {
-       if (xa_main_window == NULL)
+       XArchive *archive = data;
+
+       if (xa_main_window == NULL || archive->child_pid == 0)
+       {
+               gtk_widget_show(green_led);
+               gtk_widget_hide(red_led);
                return FALSE;
-       if ( ! GTK_WIDGET_VISIBLE(viewport2) )
-               return FALSE;
+       }
 
-       gtk_progress_bar_pulse(GTK_PROGRESS_BAR(progressbar) );
+       if (GTK_WIDGET_VISIBLE(green_led))
+       {
+               gtk_widget_hide(green_led);
+               gtk_widget_show(red_led);
+       }
+       else
+       {
+               gtk_widget_show(green_led);
+               gtk_widget_hide(red_led);
+       }
        return TRUE;
 }
 
@@ -520,7 +552,7 @@
 
        xa_set_window_title (xa_main_window , archive[id]->path);
 
-       if ( GTK_WIDGET_VISIBLE (viewport2) )
+       if (archive[id]->child_pid)
        {
                if (archive[id]->status == XA_ARCHIVESTATUS_IDLE)
                {
@@ -625,7 +657,7 @@
        gtk_tree_view_set_rubber_banding(GTK_TREE_VIEW(archive->treeview),TRUE);
 
        gtk_drag_source_set (archive->treeview, GDK_BUTTON1_MASK, drag_targets, 
1, GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK | GDK_ACTION_ASK);
-       g_signal_connect ((gpointer) sel,                               
"changed",              G_CALLBACK (xa_handle_selected_rows),archive);
+       g_signal_connect ((gpointer) sel,                               
"changed",              G_CALLBACK 
(xa_set_statusbar_message_for_selected_rows),archive);
        g_signal_connect (G_OBJECT (archive->treeview), "drag-begin",   
G_CALLBACK (drag_begin),archive);
        g_signal_connect (G_OBJECT (archive->treeview), 
"drag-data-get",G_CALLBACK (drag_data_get),archive);
        g_signal_connect (G_OBJECT (archive->treeview), "drag-end",             
G_CALLBACK (drag_end),NULL);
@@ -1301,7 +1333,7 @@
                return;
        }
        array = gtk_selection_data_get_uris(data);
-       if (array == NULL || GTK_WIDGET_VISIBLE(viewport2))
+       if (array == NULL || archive[idx]->child_pid)
        {
                response = xa_show_message_dialog (GTK_WINDOW 
(xa_main_window),GTK_DIALOG_MODAL,GTK_MESSAGE_ERROR,GTK_BUTTONS_OK,_("Sorry, I 
could not perform the operation!"),"" );
                gtk_drag_finish(context,FALSE,FALSE,time);
@@ -1441,7 +1473,7 @@
        image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_ERROR, 
GTK_ICON_SIZE_DIALOG);
        gtk_misc_set_alignment (GTK_MISC (image), 0.5, 0.0);
 
-       label = gtk_label_new (_("An error occurred while working on the 
archive:"));
+       label = gtk_label_new (_("An error occurred while accessing the 
archive:"));
        gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
        gtk_label_set_selectable (GTK_LABEL (label), TRUE);
 

Modified: xarchiver/trunk/src/interface.h
===================================================================
--- xarchiver/trunk/src/interface.h     2008-07-19 06:47:03 UTC (rev 27350)
+++ xarchiver/trunk/src/interface.h     2008-07-19 12:56:56 UTC (rev 27351)
@@ -33,9 +33,10 @@
 GtkWidget *open1;
 GtkWidget *save1;
 GtkWidget *entry1;
+GtkWidget *green_led;
+GtkWidget *red_led;
 GtkWidget *progressbar;
-GtkWidget *info_label;
-GtkWidget *viewport1,*viewport2;
+GtkWidget *total_label,*selected_label;
 GtkWidget *archive_properties_window;
 GtkWidget *table1;
 GtkWidget *path_label;
@@ -125,7 +126,7 @@
 
 gchar *xa_create_password_dialog(gchar *);
 void set_label (GtkWidget *label,gchar *);
-int xa_progressbar_pulse (gpointer );
+int xa_flash_led_indicator (gpointer );
 void xa_create_popup_menu();
 widget_data *xa_create_output_window(gchar *);
 void xa_create_main_window (GtkWidget *,gboolean,gboolean,gboolean);

Modified: xarchiver/trunk/src/main.c
===================================================================
--- xarchiver/trunk/src/main.c  2008-07-19 06:47:03 UTC (rev 27350)
+++ xarchiver/trunk/src/main.c  2008-07-19 12:56:56 UTC (rev 27351)
@@ -223,7 +223,6 @@
                        gtk_window_set_default_size 
(GTK_WINDOW(xa_main_window), 600, 400);
                        gtk_paned_set_position (GTK_PANED (hpaned1),200);
                }
-               Update_StatusBar ( _("Ready."));
                gtk_widget_show (xa_main_window);
 
                /* This to open the archive from the command line */

Modified: xarchiver/trunk/src/rpm.c
===================================================================
--- xarchiver/trunk/src/rpm.c   2008-07-19 06:47:03 UTC (rev 27350)
+++ xarchiver/trunk/src/rpm.c   2008-07-19 12:56:56 UTC (rev 27351)
@@ -124,17 +124,14 @@
        idx = xa_find_archive_index (current_page);
        gchar *gzip = data;
        
+       archive[idx]->child_pid = 0;
     if (WIFEXITED( exit_code) )
     {
            if ( WEXITSTATUS (exit_code) )
        {
-            gtk_widget_hide ( viewport2 );
                xa_set_window_title (xa_main_window , NULL);
-                   response = xa_show_message_dialog (GTK_WINDOW 
(xa_main_window),GTK_DIALOG_MODAL,GTK_MESSAGE_QUESTION,GTK_BUTTONS_OK_CANCEL,_("An
 error occurred while decompressing the cpio archive."),_("Do you want to view 
the command line output?") );
-                       if (response == GTK_RESPONSE_OK)
-                               xa_show_cmd_line_output (NULL);
+                   xa_show_cmd_line_output (NULL);
                        xa_set_button_state 
(1,1,GTK_WIDGET_IS_SENSITIVE(save1),GTK_WIDGET_IS_SENSITIVE(close1),0,0,0,0,0);
-                       //TODO: xa_hide_progress_bar_stop_button(archive[idx]);
                        return FALSE;
                }
        }

Modified: xarchiver/trunk/src/window.c
===================================================================
--- xarchiver/trunk/src/window.c        2008-07-19 06:47:03 UTC (rev 27350)
+++ xarchiver/trunk/src/window.c        2008-07-19 12:56:56 UTC (rev 27351)
@@ -43,10 +43,10 @@
 
 gboolean xa_check_child_for_error_on_exit(XArchive *archive,gint status)
 {
+       archive->child_pid = archive->pb_source = 0;
        if (xa_main_window)
        {
                gtk_widget_set_sensitive(Stop_button,FALSE);
-               gtk_widget_hide(viewport2);
        }
        if (WIFEXITED (status))
        {
@@ -79,7 +79,6 @@
        if(xa_main_window)
        {
                gtk_widget_set_sensitive(Stop_button,FALSE);
-               gtk_widget_hide(viewport2);
 
                if (archive->has_comment)
                        gtk_widget_set_sensitive (comment_menu,TRUE);
@@ -113,19 +112,13 @@
        XEntry *entry;
        if (xa_main_window != NULL)
        {
-               if (archive->type == XARCHIVETYPE_BZIP2 || archive->type == 
XARCHIVETYPE_GZIP || archive->type == XARCHIVETYPE_LZMA)
-                       Update_StatusBar ( _("Operation completed."));
-               else
-               {
-                       Update_StatusBar ( _("Please wait while the content of 
the archive is being updated..."));
-                       xa_free_entry (archive,archive->root_entry);
-                       if (archive->column_types != NULL)
-                               g_free(archive->column_types);
-                       xa_remove_columns();
-                       entry = g_new0(XEntry,1);
-                       entry->filename = "";
-                       archive->root_entry = entry;
-               }
+               xa_free_entry (archive,archive->root_entry);
+               if (archive->column_types != NULL)
+                       g_free(archive->column_types);
+               xa_remove_columns();
+               entry = g_new0(XEntry,1);
+               entry->filename = "";
+               archive->root_entry = entry;
 
                switch (archive->type)
                {
@@ -177,9 +170,9 @@
        XArchive *archive = data;
        gboolean result;
 
+       archive->child_pid = archive->pb_source = 0;
        if (WIFSIGNALED (status) )
        {
-               Update_StatusBar (_("Operation canceled."));
                if (archive->status == XA_ARCHIVESTATUS_EXTRACT)
                {
                        gchar *msg = g_strdup_printf(_("Please check \"%s\" 
since some files could have been already extracted."),archive->extraction_path);
@@ -226,8 +219,6 @@
     gtk_widget_set_sensitive(properties,FALSE );
     xa_disable_delete_buttons(FALSE);
 
-       Update_StatusBar ( _("Choose Add to begin creating the archive."));
-
     archive[current_page]->passwd = NULL;
     archive[current_page]->dummy_size = 0;
     archive[current_page]->nr_of_files = 0;
@@ -376,10 +367,6 @@
        g_free (path);
 
        gtk_widget_set_sensitive (Stop_button,TRUE);
-       gtk_widget_show (viewport2);
-
-       Update_StatusBar (_("Please wait while the content of the archive is 
being read..."));
-
        gtk_widget_set_sensitive (check_menu,FALSE);
        gtk_widget_set_sensitive (properties,FALSE);
        xa_set_button_state ( 0,0,0,0,0,0,0,0,0);
@@ -453,7 +440,6 @@
                                return;
                }
        }
-       Update_StatusBar (_("Testing archive integrity, please wait..."));
        (*archive[id]->test) (archive[id]);
 }
 
@@ -488,8 +474,7 @@
 
        xa_clean_archive_structure (archive[idx]);
        archive[idx] = NULL;
-
-       Update_StatusBar (_("Ready."));
+       gtk_label_set_text(GTK_LABEL(total_label),"");
 }
 
 void xa_quit_application (GtkMenuItem *menuitem, gpointer user_data)
@@ -497,11 +482,11 @@
        gint i;
        gint idx;
 
-       if (GTK_WIDGET_VISIBLE (viewport2))
-       {
-               Update_StatusBar ( _("Please hit the Stop button first!"));
+       i = gtk_notebook_get_current_page (notebook);
+       idx = xa_find_archive_index (i);
+       if (idx > -1 && archive[idx]->child_pid)
                return;
-       }
+       
        g_list_free ( Suffix );
        g_list_free ( Name );
 
@@ -572,7 +557,6 @@
                        return;
        }
 
-       Update_StatusBar ( _("Deleting files from the archive, please 
wait..."));
        archive[id]->status = XA_ARCHIVESTATUS_DELETE;
        (*archive[id]->delete) (archive[id],list);
 }
@@ -642,7 +626,6 @@
        current_page = gtk_notebook_get_current_page (notebook);
        idx = xa_find_archive_index ( current_page );
 
-       Update_StatusBar ( _("Converting archive to self-extracting, please 
wait..."));
     gtk_widget_set_sensitive (Stop_button,TRUE);
     archive[idx]->status = XA_ARCHIVESTATUS_SFX;
     switch ( archive[idx]->type )
@@ -690,7 +673,6 @@
                        if (archive_name == NULL)
                        {
                                gtk_widget_set_sensitive (Stop_button,FALSE);
-                               Update_StatusBar ( _("Operation canceled."));
                                return;
                        }
                        archive_name_escaped = xa_escape_bad_chars ( 
archive_name ,"$\'`\"\\!?* ()[]&|@#:;" );
@@ -761,7 +743,6 @@
                        if (archive_name == NULL)
                        {
                                gtk_widget_set_sensitive (Stop_button,FALSE);
-                               Update_StatusBar ( _("Operation canceled."));
                                return;
                        }
                        archive_name_escaped = xa_escape_bad_chars ( 
archive_name ,"$\'`\"\\!?* ()[]&|@#:;" );
@@ -798,7 +779,6 @@
                                else
                                {
                                        gtk_widget_destroy ( locate_7zcon );
-                                       Update_StatusBar (_("Operation 
canceled."));
                                        return;
                                }
                        }
@@ -1232,7 +1212,6 @@
                if (response == GTK_RESPONSE_CANCEL)
                        return;
        }
-       Update_StatusBar (_("Operation aborted."));
        if (archive[idx]->child_pid)
        {
                kill (archive[idx]->child_pid,SIGABRT);
@@ -1356,22 +1335,79 @@
     gtk_widget_show_all (archive_properties_window);
 }
 
-void xa_handle_selected_rows (GtkTreeSelection *selection,gpointer data)
+void xa_set_statusbar_message_for_displayed_rows(XArchive *archive)
 {
+       gchar *info = NULL;
+       GtkTreePath *path = NULL;
+       GtkTreeIter iter;
+       gint n_elem = 0,pos = 0,dirs = 0;
+       unsigned long int total_size = 0;
+       unsigned int size = 0;
+       XEntry *entry;
+
+       path = gtk_tree_path_new_first();
+       if (gtk_tree_model_get_iter (archive->model, &iter, path) == FALSE)
+               return;
+
+       switch (archive->type)
+       {
+               case XARCHIVETYPE_GZIP:
+               case XARCHIVETYPE_BZIP2:
+               case XARCHIVETYPE_LZMA:
+               case XARCHIVETYPE_RPM:
+               pos = 3;
+               break;
+
+               case XARCHIVETYPE_RAR:
+               case XARCHIVETYPE_ARJ:
+               case XARCHIVETYPE_7ZIP:
+               pos = 2;
+               break;
+
+               case XARCHIVETYPE_LHA:
+               pos = 4;
+               break;
+
+               case XARCHIVETYPE_TAR_GZ:
+               case XARCHIVETYPE_TAR_BZ2:
+               case XARCHIVETYPE_TAR_LZMA:
+               case XARCHIVETYPE_TAR:
+               case XARCHIVETYPE_DEB:
+               case XARCHIVETYPE_ZIP:
+               pos = 5;
+               break;
+
+               default:
+               break;
+       }
+       gtk_tree_path_free(path);
+       do
+       {
+               n_elem++;
+               gtk_tree_model_get (archive->model,&iter,pos,&size,-1);
+               gtk_tree_model_get 
(archive->model,&iter,archive->nc+1,&entry,-1);
+               if (entry->is_dir)
+                       dirs++;
+               total_size += size;
+       }
+       while (gtk_tree_model_iter_next (archive->model,&iter));
+       info = xa_get_statusbar_message(total_size,n_elem,dirs,FALSE);
+       gtk_label_set_text (GTK_LABEL(total_label),info);
+       g_free(info);
+}
+
+void xa_set_statusbar_message_for_selected_rows (GtkTreeSelection 
*selection,gpointer data)
+{
        XArchive *archive = data;
        GList *list = NULL;
-       gchar *measure = NULL;
-       gchar *info = NULL;
+       gchar *msg = NULL;
        GtkTreeIter iter;
        GtkTreeModel *model;
-       GtkTreePath *path = NULL;
-       gint selected,n_elem = 0,pos = 0;
+       gint selected = 0,pos = 0, dirs = 0;
        unsigned long int total_size = 0;
        unsigned int size = 0;
+       XEntry *entry;
 
-       /*if ( ! GTK_WIDGET_VISIBLE (Extract_button) )
-               return;*/
-
        switch (archive->type)
        {
                case XARCHIVETYPE_GZIP:
@@ -1401,102 +1437,76 @@
                break;
 
                default:
-               size = 0;
+               break;
        }
        model = gtk_tree_view_get_model(GTK_TREE_VIEW(archive->treeview));
-       if (selection == NULL)
-               goto here;
        selected = gtk_tree_selection_count_selected_rows (selection);
 
        if (selected == 0 )
+       {
                xa_disable_delete_buttons (FALSE);
-       else
+               gtk_label_set_text (GTK_LABEL(selected_label),_("No files 
selected"));
+               return;
+       }
+       if (archive->type == XARCHIVETYPE_RAR && unrar)
+               gtk_widget_set_sensitive (delete_menu,FALSE);
+       else if ( archive->type != XARCHIVETYPE_RPM && archive->type != 
XARCHIVETYPE_DEB)
+               gtk_widget_set_sensitive (delete_menu,TRUE);
+
+       list = gtk_tree_selection_get_selected_rows(selection,NULL);
+       while (list)
        {
-               if (archive->type == XARCHIVETYPE_RAR && unrar)
-                       gtk_widget_set_sensitive ( delete_menu,FALSE);
-               else if ( archive->type != XARCHIVETYPE_RPM && archive->type != 
XARCHIVETYPE_DEB)
-                       gtk_widget_set_sensitive (delete_menu,TRUE);
+               gtk_tree_model_get_iter(model,&iter,list->data);
+               gtk_tree_model_get (model,&iter,pos,&size,-1);
+               gtk_tree_model_get 
(archive->model,&iter,archive->nc+1,&entry,-1);
+               if (entry->is_dir)
+                       dirs++;
+               gtk_tree_path_free (list->data);
+               total_size += size;
+               list = list->next;
        }
-       if (selected > 0)
+       g_list_free(list);
+       msg = xa_get_statusbar_message(total_size,selected,dirs,TRUE);
+       gtk_label_set_text (GTK_LABEL(selected_label),msg);
+       g_free(msg);
+}
+
+gchar *xa_get_statusbar_message(unsigned long int total_size,gint n_elem,gint 
dirs,gboolean selection)
+{
+       gchar *measure = NULL, *info = NULL;
+
+       if (total_size > 1024*1024*1024)
        {
-               list = gtk_tree_selection_get_selected_rows(selection,NULL);
-               while (list)
-               {
-                       gtk_tree_model_get_iter(model,&iter,list->data);
-                       gtk_tree_model_get (model,&iter,pos,&size,-1);
-                       gtk_tree_path_free (list->data);
-                       total_size += size;
-                       list = list->next;
-               }
-               g_list_free(list);
-               if (total_size > 1024*1024*1024 )
-               {
-                       content_size = (double)total_size / (1024*1024*1024);
-                       measure = "GB";
-               }
-               else if (total_size > 1024*1024 )
-               {
-                       content_size = (double)total_size / (1024*1024);
-                       measure = "MB";
-               }
-       else if (total_size > 1024 )
-               {
-                       content_size = (double)total_size / 1024;
-                       measure = "KB";
-               }
-               else
-               {
-                       measure = "Bytes";
-                       content_size = total_size;
-               }
-               info = g_strdup_printf(ngettext ("%d item selected (%.1f %s)", 
"%d items selected (%.1f %s)", selected),selected,content_size,measure);
+               content_size = (double)total_size / (1024*1024*1024);
+               measure = "GB";
        }
+       else if (total_size > 1024*1024)
+       {
+               content_size = (double)total_size / (1024*1024);
+               measure = "MB";
+       }
+       else if (total_size > 1024)
+       {
+               content_size = (double)total_size / 1024;
+               measure = "KB";
+       }
        else
        {
-here:
-               if (model == NULL)
-                       return;
-               path = gtk_tree_path_new_first();
-               if (gtk_tree_model_get_iter (model, &iter, path) == FALSE)
-                       return;
-               do
-       {
-               n_elem++;
-               gtk_tree_model_get (model,&iter,pos,&size,-1);
-                       total_size += size;
-       }
-               while (gtk_tree_model_iter_next (model,&iter));
-               if (total_size > 1024*1024*1024 )
-               {
-                       content_size = (double)total_size / (1024*1024*1024);
-                       measure = "GB";
-               }
-               else if (total_size > 1024*1024 )
-               {
-                       content_size = (double)total_size / (1024*1024);
-                       measure = "MB";
-               }
-       else if (total_size > 1024 )
-               {
-                       content_size = (double)total_size / 1024;
-                       measure = "KB";
-               }
-               else
-               {
-                       measure = "Bytes";
-                       content_size = total_size;
-               }
-               info = g_strdup_printf(ngettext ("%d item (%.1f %s)", "%d items 
(%.1f %s)", n_elem),n_elem,content_size,measure);
+               measure = "Bytes";
+               content_size = total_size;
        }
-       Update_StatusBar(info);
-       g_free(info);
+       if (selection)
+               info = g_strdup_printf(ngettext ("%d file and %d dir selected 
(%.1f %s)","%d files and %d dirs selected (%.1f 
%s)",n_elem),n_elem,dirs,content_size,measure);
+       else
+               info = g_strdup_printf(ngettext ("%d file, %d dir (%.1f %s)", 
"%d files, %d dirs (%.1f %s)", n_elem),n_elem,dirs,content_size,measure);
+       return info;
 }
 
 void Update_StatusBar (gchar *msg)
 {
        if (xa_main_window == NULL)
                return;
-       gtk_label_set_text (GTK_LABEL(info_label),msg);
+       gtk_label_set_text (GTK_LABEL(total_label),msg);
 }
 
 void drag_begin (GtkWidget *treeview1,GdkDragContext *context, gpointer data)
@@ -1630,8 +1640,10 @@
        gint idx;
 
        current_page = gtk_notebook_get_current_page(notebook);
+       idx = xa_find_archive_index (current_page);
        array = gtk_selection_data_get_uris(data);
-       if (array == NULL || GTK_WIDGET_VISIBLE(viewport2))
+
+       if (array == NULL || archive[idx]->child_pid)
        {
                response = xa_show_message_dialog (GTK_WINDOW 
(xa_main_window),GTK_DIALOG_MODAL,GTK_MESSAGE_ERROR,GTK_BUTTONS_OK,_("Sorry, I 
could not perform the operation!"),"" );
                gtk_drag_finish(context,FALSE,FALSE,time);
@@ -1720,8 +1732,7 @@
        switch (event->keyval)
        {
                case GDK_Escape:
-               if ( GTK_WIDGET_VISIBLE (viewport2) )
-                       xa_cancel_archive (NULL, NULL);
+               xa_cancel_archive (NULL, NULL);
                break;
 
        }
@@ -2059,5 +2070,5 @@
                entry = entry->next;
        }
        xa_fill_dir_sidebar(archive,FALSE);
-       xa_handle_selected_rows(NULL,archive);
+       xa_set_statusbar_message_for_displayed_rows(archive);
 }

Modified: xarchiver/trunk/src/window.h
===================================================================
--- xarchiver/trunk/src/window.h        2008-07-19 06:47:03 UTC (rev 27350)
+++ xarchiver/trunk/src/window.h        2008-07-19 12:56:56 UTC (rev 27351)
@@ -82,31 +82,33 @@
 void xa_cancel_archive ( GtkMenuItem * , gpointer);
 void xa_add_files_archive ( GtkMenuItem *, gpointer);
 void xa_show_prefs_dialog ( GtkMenuItem * , gpointer);
-void xa_handle_selected_rows (GtkTreeSelection *treeselection,gpointer data);
-void on_drag_data_received (GtkWidget *widget,GdkDragContext *context, int 
x,int y,GtkSelectionData *data, unsigned int info, unsigned int time, gpointer 
);
-void drag_begin (GtkWidget *treeview1,GdkDragContext *context, gpointer data);
-void drag_end (GtkWidget *treeview1, GdkDragContext *context, gpointer data);
-void drag_data_get (GtkWidget *widget, GdkDragContext *dc, GtkSelectionData 
*selection_data, guint info, guint t, gpointer data);
+void xa_set_statusbar_message_for_selected_rows (GtkTreeSelection *,gpointer );
+void xa_set_statusbar_message_for_displayed_rows(XArchive *);
+void on_drag_data_received (GtkWidget *,GdkDragContext *, int x,int 
y,GtkSelectionData *, unsigned int , unsigned int , gpointer );
+void drag_begin (GtkWidget *,GdkDragContext *, gpointer );
+void drag_end (GtkWidget *, GdkDragContext *, gpointer );
+void drag_data_get (GtkWidget *, GdkDragContext *dc, GtkSelectionData *, guint 
, guint t, gpointer );
 
-int xa_show_message_dialog ( GtkWindow *window, int mode,int type,int button, 
const gchar *,const gchar *);
-int xa_detect_archive_type ( gchar *filename );
+int xa_show_message_dialog ( GtkWindow *, int,int ,int , const gchar *,const 
gchar *);
+int xa_detect_archive_type ( gchar * );
 gboolean xa_detect_archive_comment ( int type, gchar *, XArchive * );
-gboolean key_press_function ( GtkWidget* widget, GdkEventKey* event,gpointer 
data);
-gboolean treeview_select_search (GtkTreeModel *model,gint column,const gchar 
*key,GtkTreeIter *,gpointer );
-gboolean xa_check_child_for_error_on_exit(XArchive *,gint status);
+gboolean key_press_function ( GtkWidget* , GdkEventKey* ,gpointer );
+gboolean treeview_select_search (GtkTreeModel *,gint ,const gchar 
*,GtkTreeIter *,gpointer );
+gboolean xa_check_child_for_error_on_exit(XArchive *,gint );
 void xa_archive_operation_finished(XArchive *);
 void xa_reload_archive_content(XArchive *);
-void xa_watch_child ( GPid pid, gint status, gpointer data);
+void xa_watch_child ( GPid , gint , gpointer );
 void xa_remove_columns();
-void xa_create_liststore ( XArchive *, gchar *columns_names[]);
+void xa_create_liststore (XArchive *,gchar *[]);
+gchar *xa_get_statusbar_message(unsigned long int,gint,gint,gboolean);
 void Update_StatusBar (gchar *);
 
 gchar *xa_open_file_dialog ();
 gchar *xa_open_sfx_file_selector ();
-void xa_activate_link (GtkAboutDialog *about,const gchar *link,gpointer data);
+void xa_activate_link (GtkAboutDialog *about,const gchar *,gpointer );
 void xa_location_entry_activated (GtkEntry *entry,gpointer );
-int xa_mouse_button_event(GtkWidget *widget,GdkEventButton *event,gpointer 
data);
-void xa_treeview_row_activated(GtkTreeView *tree_view,GtkTreePath 
*path,GtkTreeViewColumn *column,gpointer );
-void xa_update_window_with_archive_entries(XArchive *archive,XEntry *entry);
+int xa_mouse_button_event(GtkWidget *,GdkEventButton *,gpointer );
+void xa_treeview_row_activated(GtkTreeView *,GtkTreePath *,GtkTreeViewColumn 
*,gpointer );
+void xa_update_window_with_archive_entries(XArchive *,XEntry *);
 #endif
 

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

Reply via email to