[grisbi-cvs] [SCM] grisbi branch, master, updated. upstream_version_0_9.0-128-g5b2a3de

Pierre Biava nobody at users.sourceforge.net
Sat Apr 16 18:36:43 CEST 2011


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "grisbi".

The branch, master has been updated
       via  5b2a3de65b76f667f16e046b5045801a354ec603 (commit)
       via  799c9be9eadbbb1d30a5cba33f12b7454a6f2a0d (commit)
      from  77f4631ec66959d70518424c5a04bf2beb96663c (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 5b2a3de65b76f667f16e046b5045801a354ec603
Author: pbiava <pierre.biava at nerim.net>
Date:   Sat Apr 16 18:30:52 2011 +0200

    Fixed a bug in the selection form of planned transactions. Adds support for the variance for the planned transactions.
    (cherry picked from commit 0babebc9fe0dbaf7226251e2fc5fe1e8fa28b3e8)

commit 799c9be9eadbbb1d30a5cba33f12b7454a6f2a0d
Author: pbiava <pierre.biava at nerim.net>
Date:   Sat Apr 16 18:00:57 2011 +0200

    Fixed a display bug of a report while navigating in the left window Grisbi
    (cherry picked from commit 7544052c224eb02a4671a0469ba92170eb803354)

-----------------------------------------------------------------------

Changes:
diff --git a/src/etats_onglet.c b/src/etats_onglet.c
index 42d50ef..3326805 100644
--- a/src/etats_onglet.c
+++ b/src/etats_onglet.c
@@ -52,6 +52,7 @@
 #include "utils_files.h"
 #include "structures.h"
 #include "fenetre_principale.h"
+#include "erreur.h"
 /*END_INCLUDE*/
 
 /*START_STATIC*/
@@ -993,6 +994,9 @@ void gsb_gui_update_gui_to_report ( gint report_number )
 	rafraichissement_etat ( report_number );
 	gsb_report_set_current (report_number);
     }
+    else
+        etat_affiche_finish ( );
+;
 }
 
 
diff --git a/src/gsb_data_scheduled.c b/src/gsb_data_scheduled.c
index feebd9d..0efb281 100644
--- a/src/gsb_data_scheduled.c
+++ b/src/gsb_data_scheduled.c
@@ -42,6 +42,7 @@
 #include "gsb_real.h"
 #include "utils_dates.h"
 #include "utils_str.h"
+#include "erreur.h"
 /*END_INCLUDE*/
 
 
@@ -1875,6 +1876,42 @@ gboolean gsb_data_scheduled_copy_scheduled ( gint source_scheduled_number,
 }
 
 
+/**
+ * retourne TRUE si la variance de l'opération ventilée == 0
+ *
+ *
+ *
+ * */
+gboolean gsb_data_scheduled_get_variance ( gint mother_scheduled_number )
+{
+    GSList *tmp_list;
+    gsb_real total_split = null_real;
+    gsb_real variance;
+
+    tmp_list = scheduled_list;
+    while ( tmp_list )
+    {
+        struct_scheduled *tmp_scheduled;
+
+        tmp_scheduled = tmp_list -> data;
+
+        if ( tmp_scheduled -> mother_scheduled_number == mother_scheduled_number )
+        {
+            total_split = gsb_real_add ( total_split,
+                        gsb_data_scheduled_get_amount ( tmp_scheduled -> scheduled_number ) );
+        }
+        tmp_list = tmp_list -> next;
+    }
+
+    variance = gsb_real_sub ( gsb_data_scheduled_get_amount ( mother_scheduled_number ), total_split );
+
+    if ( variance.mantissa == 0 )
+        return TRUE;
+    else
+        return FALSE;
+}
+
+
 /* Local Variables: */
 /* c-basic-offset: 4 */
 /* End: */
diff --git a/src/gsb_data_scheduled.h b/src/gsb_data_scheduled.h
index 88825e4..37b738a 100644
--- a/src/gsb_data_scheduled.h
+++ b/src/gsb_data_scheduled.h
@@ -39,6 +39,7 @@ gint gsb_data_scheduled_get_sub_budgetary_number ( gint scheduled_number );
 gint gsb_data_scheduled_get_sub_category_number ( gint scheduled_number );
 gint gsb_data_scheduled_get_user_entry ( gint scheduled_number );
 gint gsb_data_scheduled_get_user_interval ( gint scheduled_number );
+gboolean gsb_data_scheduled_get_variance ( gint mother_scheduled_number );
 gint gsb_data_scheduled_get_white_line ( gint scheduled_number);
 gboolean gsb_data_scheduled_init_variables ( void );
 gboolean gsb_data_scheduled_is_transfer ( gint scheduled_number );
diff --git a/src/gsb_form.c b/src/gsb_form.c
index 367b930..51e81ae 100644
--- a/src/gsb_form.c
+++ b/src/gsb_form.c
@@ -540,19 +540,24 @@ gboolean gsb_form_fill_by_transaction ( gint transaction_number,
     /* we take focus only if asked */
     if (grab_focus)
     {
-	/* the form is full, if it's not a split, we give the focus to the date
-	 * else, we give the focus to the first free form element */
-	if (mother_number)
-	    focus_to = gsb_form_widget_next_element ( account_number,
+        GtkWidget *widget;
+
+        /* the form is full, if it's not a split, we give the focus to the date
+         * else, we give the focus to the first free form element */
+        if (mother_number)
+            focus_to = gsb_form_widget_next_element ( account_number,
 						      TRANSACTION_FORM_DATE,
 						      GSB_RIGHT );
-	else
-	    focus_to = TRANSACTION_FORM_DATE;
+        else
+            focus_to = TRANSACTION_FORM_DATE;
+
+        widget = gsb_form_widget_get_widget ( focus_to );
+        gtk_editable_select_region ( GTK_EDITABLE ( widget ), 0, -1 );
+        if ( !is_transaction && gtk_widget_is_focus ( widget ) )
+            gsb_form_widget_entry_get_focus ( widget, NULL, GINT_TO_POINTER ( focus_to ) );
+        else
+            gtk_widget_grab_focus ( widget );
 
-	gtk_editable_select_region ( GTK_EDITABLE ( gsb_form_widget_get_widget (focus_to)),
-				  0,
-				  -1);
-	gtk_widget_grab_focus ( gsb_form_widget_get_widget (focus_to));
     }
 
     return FALSE;
@@ -2644,25 +2649,27 @@ gboolean gsb_form_finish_edition ( void )
 	/* we need to use edit_transaction to make a new child split if necessary */
 	if ( is_transaction)
 	    gsb_transactions_list_edit_transaction (
-                        gsb_data_account_get_current_transaction_number (account_number) );
+                        gsb_data_account_get_current_transaction_number ( account_number ) );
 	else
-	    gsb_scheduler_list_edit_transaction (gsb_scheduler_list_get_current_scheduled_number ());
+	    gsb_scheduler_list_edit_transaction ( gsb_scheduler_list_get_current_scheduled_number ( ) );
     }
     else
         gsb_form_hide ();
 
     /* on sort de la saisie des opérations filles si variance == 0 */
-    if ( is_transaction
-     &&
-     ( mother_number = gsb_data_transaction_get_mother_transaction_number ( transaction_number ) )
-     &&
-     transaction_list_get_variance ( gsb_data_account_get_current_transaction_number (
-                        account_number ) ) )
-        transaction_list_select ( mother_number );
+    if ( ( mother_number = gsb_data_mix_get_mother_transaction_number ( transaction_number, is_transaction ) ) )
+    {
+        if ( is_transaction
+         &&
+         transaction_list_get_variance ( gsb_data_account_get_current_transaction_number ( account_number ) ) )
+            transaction_list_select ( mother_number );
+        else if ( !is_transaction && !execute_scheduled && gsb_data_scheduled_get_variance ( mother_number ) )
+            gsb_scheduler_list_select ( mother_number );
+    }
 
     /* if it was a modification of transaction, we need to update the sort and colors
      * (done automatically for new transaction) */
-    if ( !new_transaction && !execute_scheduled )
+    if ( is_transaction && !new_transaction )
         gsb_transactions_list_update_tree_view (account_number, TRUE);
 
     /* show the warnings */
diff --git a/src/gsb_form_widget.c b/src/gsb_form_widget.c
index 025baef..b122725 100644
--- a/src/gsb_form_widget.c
+++ b/src/gsb_form_widget.c
@@ -57,9 +57,6 @@
 static gboolean gsb_form_combo_selection_changed ( GtkTreeSelection *tree_selection,
 						  gint *ptr_origin );
 static gboolean gsb_form_widget_can_focus ( gint element_number );
-static gboolean gsb_form_widget_entry_get_focus ( GtkWidget *entry,
-                        GdkEventFocus *ev,
-                        gint *ptr_origin );
 /*END_STATIC*/
 
 /*START_EXTERN*/
diff --git a/src/gsb_form_widget.h b/src/gsb_form_widget.h
index e68c5da..3f166aa 100644
--- a/src/gsb_form_widget.h
+++ b/src/gsb_form_widget.h
@@ -25,6 +25,9 @@ gboolean gsb_form_widget_amount_entry_validate ( gint element_number );
 gboolean gsb_form_widget_check_empty ( GtkWidget *entry );
 GtkWidget *gsb_form_widget_create ( gint element_number,
                         gint account_number );
+gboolean gsb_form_widget_entry_get_focus ( GtkWidget *entry,
+                        GdkEventFocus *ev,
+                        gint *ptr_origin );
 gboolean gsb_form_widget_free_list ( void );
 GSList *gsb_form_widget_get_list ( void );
 gchar *gsb_form_widget_get_name ( gint element_number );
diff --git a/src/gsb_scheduler_list.c b/src/gsb_scheduler_list.c
index 2138471..e53b1a3 100644
--- a/src/gsb_scheduler_list.c
+++ b/src/gsb_scheduler_list.c
@@ -107,6 +107,8 @@ static gint gsb_scheduler_list_sort_function_by_payee ( GtkTreeModel *model,
                         GtkTreeIter *iter_2,
                         gint *column_ptr );
 static gboolean gsb_scheduler_list_switch_expander ( gint scheduled_number );
+static gboolean gsb_scheduler_list_update_white_child ( gint white_line_number,
+                        gint mother_scheduled_number );
 static void popup_scheduled_context_menu ( void );
 /*END_STATIC*/
 
@@ -120,6 +122,7 @@ extern GdkColor couleur_selection;
 extern struct conditional_message delete_msg[];
 extern gint mise_a_jour_liste_echeances_manuelles_accueil;
 extern GtkWidget * navigation_tree_view;
+extern gsb_real null_real;
 extern GtkWidget *scheduler_button_delete;
 extern GtkWidget *scheduler_button_edit;
 extern GtkWidget *scheduler_button_execute;
@@ -839,12 +842,17 @@ gboolean gsb_scheduler_list_append_new_scheduled ( gint scheduled_number,
     mother_scheduled_number = gsb_data_scheduled_get_mother_scheduled_number ( scheduled_number );
     if ( mother_scheduled_number )
     {
+        gint white_line_number;
+
         mother_iter = gsb_scheduler_list_get_iter_from_scheduled_number ( mother_scheduled_number );
         if ( !mother_iter )
             /* it's a child but didn't find the mother, it can happen in old files previous to 0.6
              * where the children wer saved before the mother, return FALSE here will add that
              * child to a list to append it again later */
             return FALSE;
+
+        white_line_number = gsb_data_scheduled_get_white_line ( mother_scheduled_number );
+        gsb_scheduler_list_update_white_child ( white_line_number, mother_scheduled_number );
     }
 
     pGDateCurrent = gsb_date_copy ( gsb_data_scheduled_get_date ( scheduled_number ) );
@@ -879,6 +887,8 @@ gboolean gsb_scheduler_list_append_new_scheduled ( gint scheduled_number,
                 white_line_number = gsb_data_scheduled_new_white_line ( scheduled_number );
                 gsb_scheduler_list_append_new_scheduled ( white_line_number, end_date );
             }
+
+            gsb_scheduler_list_update_white_child ( white_line_number, scheduled_number );
         }
 
         /* if it's a split, we show only one time and color the background */
@@ -985,63 +995,73 @@ gboolean gsb_scheduler_list_update_transaction_in_list ( gint scheduled_number )
 
     devel_debug_int (scheduled_number);
 
-    if ( !scheduled_number
-	 ||
-	 !gsb_scheduler_list_get_model ())
-	return FALSE;
+    if ( !scheduled_number || !gsb_scheduler_list_get_model ( ) )
+        return FALSE;
 
     /* the same transaction can be showed more than one time because of the different views,
      * not so difficult, go throw the list and for each iter corresponding to the scheduled
      * transaction, re-fill the line */
-    store = GTK_TREE_STORE (gsb_scheduler_list_get_model ());
+    store = GTK_TREE_STORE ( gsb_scheduler_list_get_model ( ) );
 
-    pGDateCurrent = gsb_date_copy (gsb_data_scheduled_get_date (scheduled_number));
+    pGDateCurrent = gsb_date_copy ( gsb_data_scheduled_get_date ( scheduled_number ) );
 
     /* fill the text line */
-    gsb_scheduler_list_fill_transaction_text ( scheduled_number,
-					       line );
+    gsb_scheduler_list_fill_transaction_text ( scheduled_number, line );
 
-    if (gtk_tree_model_get_iter_first ( GTK_TREE_MODEL (store), &iter))
+    if ( gtk_tree_model_get_iter_first ( GTK_TREE_MODEL ( store ), &iter ) )
     {
-	do
-	{
-	    gint scheduled_number_tmp;
-	    GtkTreeIter child_iter;
+        do
+        {
+            gint scheduled_number_tmp;
+            GtkTreeIter child_iter;
+
+            gtk_tree_model_get ( GTK_TREE_MODEL ( store ),
+                                &iter,
+                                SCHEDULER_COL_NB_TRANSACTION_NUMBER, &scheduled_number_tmp,
+                                -1 );
+            if ( scheduled_number_tmp == scheduled_number )
+            {
+                gsb_scheduler_list_fill_transaction_row ( GTK_TREE_STORE ( store ), &iter, line );
 
-	    gtk_tree_model_get ( GTK_TREE_MODEL (store), &iter,
-				 SCHEDULER_COL_NB_TRANSACTION_NUMBER, &scheduled_number_tmp,
-				 -1 );
-	    if (scheduled_number_tmp == scheduled_number)
-	    {
-		gsb_scheduler_list_fill_transaction_row ( GTK_TREE_STORE (store),
-							  &iter,
-							  line );
-		/* go to the next date if ever there is several lines of that scheduled */
-		pGDateCurrent = gsb_scheduler_get_next_date ( scheduled_number, pGDateCurrent );
+                /* go to the next date if ever there is several lines of that scheduled */
+                pGDateCurrent = gsb_scheduler_get_next_date ( scheduled_number, pGDateCurrent );
 
-		line[COL_NB_DATE] = gsb_format_gdate ( pGDateCurrent );
-	    }
+                line[COL_NB_DATE] = gsb_format_gdate ( pGDateCurrent );
+            }
 
-	    /* i still haven't found a function to go line by line, including the children,
-	     * so do another do/while into the first one */
-	    if (gtk_tree_model_iter_children (GTK_TREE_MODEL (store), &child_iter, &iter))
-	    {
-		/* we are on the child */
-		do
-		{
-		    gtk_tree_model_get ( GTK_TREE_MODEL (store), &child_iter,
-					 SCHEDULER_COL_NB_TRANSACTION_NUMBER, &scheduled_number_tmp,
-					 -1 );
-		    if (scheduled_number_tmp == scheduled_number)
-			gsb_scheduler_list_fill_transaction_row ( GTK_TREE_STORE (store),
-								  &child_iter,
-								  line );
-		}
-		while ( gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &child_iter));
-	    }
-	}
-	while ( gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter));
+            /* i still haven't found a function to go line by line, including the children,
+             * so do another do/while into the first one */
+            if ( gtk_tree_model_iter_children ( GTK_TREE_MODEL ( store ), &child_iter, &iter ) )
+            {
+                gint white_line_number = 0;
+                gint mother_number = 0;
+                /* we are on the child */
+                do
+                {
+                    gtk_tree_model_get ( GTK_TREE_MODEL (store),
+                                        &child_iter,
+                                        SCHEDULER_COL_NB_TRANSACTION_NUMBER, &scheduled_number_tmp,
+                                        -1 );
+
+                    if ( scheduled_number_tmp < -1 )
+                    {
+                        white_line_number = scheduled_number_tmp;
+                        mother_number = gsb_data_scheduled_get_mother_scheduled_number ( white_line_number );
+                    }
+
+                    if (scheduled_number_tmp == scheduled_number)
+                        gsb_scheduler_list_fill_transaction_row ( GTK_TREE_STORE (store),
+                                        &child_iter,
+                                        line );
+                }
+                while ( gtk_tree_model_iter_next ( GTK_TREE_MODEL ( store ), &child_iter ) );
+
+                gsb_scheduler_list_update_white_child ( white_line_number, mother_number );
+            }
+        }
+        while ( gtk_tree_model_iter_next ( GTK_TREE_MODEL ( store ), &iter ) );
     }
+
     return FALSE;
 }
 
@@ -2520,6 +2540,69 @@ gint gsb_scheduler_list_sort_function_by_account ( GtkTreeModel *model,
 }
 
 
+gboolean gsb_scheduler_list_update_white_child ( gint white_line_number,
+                        gint mother_scheduled_number )
+{
+    GtkTreeIter *iter = NULL;
+    GSList *tmp_list;
+    gsb_real total_split = null_real;
+    gsb_real variance;
+    gchar *tmp_str;
+
+    if ( !tree_model_scheduler_list )
+        return FALSE;
+
+    iter = gsb_scheduler_list_get_iter_from_scheduled_number ( white_line_number );
+    if ( !iter )
+        return FALSE;
+
+    tmp_list = gsb_data_scheduled_get_scheduled_list (  );
+    while ( tmp_list )
+    {
+        gint split_scheduled_number;
+
+        split_scheduled_number = gsb_data_scheduled_get_scheduled_number ( tmp_list -> data );
+
+        if ( gsb_data_scheduled_get_mother_scheduled_number (
+         split_scheduled_number ) == mother_scheduled_number )
+        {
+            total_split = gsb_real_add ( total_split,
+                        gsb_data_scheduled_get_amount ( split_scheduled_number ) );
+        }
+        tmp_list = tmp_list -> next;
+    }
+
+    variance = gsb_real_sub ( gsb_data_scheduled_get_amount ( mother_scheduled_number ), total_split );
+
+    /* show the variance and sub-total only if different of the scheduled */
+    if ( variance.mantissa )
+    {
+        gchar *amount_string;
+        gchar *variance_string;
+        gint currency_number;
+
+        currency_number = gsb_data_scheduled_get_currency_number ( mother_scheduled_number );
+        amount_string = gsb_real_get_string_with_currency ( total_split, currency_number, TRUE);
+        variance_string = gsb_real_get_string_with_currency (variance, currency_number, TRUE);
+
+        tmp_str = g_strdup_printf ( _("Total : %s (variance : %s)"), amount_string, variance_string );
+
+        g_free ( amount_string );
+        g_free ( variance_string );
+    }
+    else
+        tmp_str = "";
+
+    gtk_tree_store_set ( GTK_TREE_STORE ( tree_model_scheduler_list ), iter, 2, tmp_str, -1 );
+
+    if ( tmp_str && strlen ( tmp_str ) )
+        g_free ( tmp_str );
+
+    return TRUE;
+}
+
+
+
 /* Local Variables: */
 /* c-basic-offset: 4 */
 /* End: */


hooks/post-receive
-- 
grisbi


More information about the cvs mailing list