rem: if ( compte_vire == compte_courant )
add: if ( compte_vire == GPOINTER_TO_INT ( gtk_object_get_data ( GTK_OBJECT ( GTK_OPTION_MENU ( widget_formulaire_echeancier[SCHEDULER_FORM_ACCOUNT] ) -> menu_item ), "no_compte" )) )
context: void fin_edition_ventilation_echeances ( void ){    struct struct_ope_ventil *operation;    gint modification;    gchar **tableau_char;    gint compte_vire;    gint perte_ligne_selectionnee;    /* pour éviter les warnings lors de la compil */    compte_vire = 0;    tableau_char = NULL;    /* on met le focus sur la liste des opés pour éventuellement faire perdre le focus aux entrées des */    /* montants pour faire les modifs nécessaires automatiquement */    gtk_window_set_focus ( GTK_WINDOW ( window ),			   liste_echeances_ventilees );    /* perte ligne sélectionnée sera à 1 s'il y a une magouille avec les virements et */    /* qu'on recrée une opé au lieu de la modifier. dans ce cas on remettra la ligne */    /* sélectionné sur la nouvelle opé */    perte_ligne_selectionnee = 0;    /*   dans cette fonction, on récupère les infos du formulaire_echeancier qu'on met dans une structure */    /* de ventilation, et on ajoute cette structure à celle en cours (ou modifie si elle existait */    /* déjà */    /* on vérifie si c'est un virement que le compte est valide et que ce n'est pas un virement sur lui-même */    if ( gtk_widget_get_style ( GTK_COMBOFIX ( widget_formulaire_ventilation_echeances[SCHEDULER_BREAKDOWN_FORM_CATEGORY] ) -> entry ) == style_entree_formulaire[ENCLAIR] )    {	/*       on split déjà les catég, sans libérer la variable, pour la récupérer ensuite pour les categ */	tableau_char = g_strsplit ( g_strstrip ( gtk_combofix_get_text ( GTK_COMBOFIX ( widget_formulaire_ventilation_echeances[SCHEDULER_BREAKDOWN_FORM_CATEGORY] ))),				    ":",				    2 );	if ( tableau_char[0]  )	{	    tableau_char[0] = g_strstrip ( tableau_char[0] );	    if ( tableau_char[1] )		tableau_char[1] = g_strstrip ( tableau_char[1] );	    if ( !strcmp ( tableau_char[0],			   _("Transfer")))	    {		gint i;		if ( tableau_char[1] )		{		    compte_vire = -1;		    for ( i = 0 ; i < nb_comptes ; i++ )		    {			p_tab_nom_de_compte_variable = p_tab_nom_de_compte + i;			if ( !strcmp ( NOM_DU_COMPTE,				       tableau_char[1] ) )			    compte_vire = i;		    }		    if ( compte_vire == -1 )		    {			dialogue_error ( _("The associated account for this transfer is invalid") );			return;		    }		    if ( compte_vire == compte_courant )		    {			dialogue_error ( _("It's impossible to transfer an account to itself") );			return;		    }		}		else		{		    dialogue_error ( _("No account associated with the transfer") );		    return;		}	    }	}    }    /*   on récupère l'adresse de l'opération, soit c'est une modif, soit c'est une nouvelle (-1) */    operation = gtk_object_get_data ( GTK_OBJECT ( widget_formulaire_ventilation_echeances[SCHEDULER_BREAKDOWN_FORM_CATEGORY] ),				      "adr_struct_ope" );    if (operation == GINT_TO_POINTER ( -1 ))    {	operation = calloc ( 1,			     sizeof ( struct struct_ope_ventil ));	modification = 0;    }    else	modification = 1;    /*   récupération des catégories / sous-catég, s'ils n'existent pas, on les crée */    /* la variable tableau_char est déjà initialisée lors des tests du virement */    /*   il y a 3 possibilités en rapport avec les virements : */    /* si l'ancienne opé était un virement, la nouvelle est : */    /* soit virement vers le même compte */    /* soit virement vers un autre compte */    /* soit ce n'est plus un virement */    /*     pour la 1ère, c'est une modif normale d'opé */    /*     pour les 2nde et 3ème, on supprime cette opé et en recrée une nouvelle */    /* il faut donc mettre la récup des catég en premier car il peut y avoir un changement au niveau des */    /* modif avec suppression de l'ancienne et création d'une nouvelle ope */    if ( gtk_widget_get_style ( GTK_COMBOFIX ( widget_formulaire_ventilation_echeances[SCHEDULER_BREAKDOWN_FORM_CATEGORY] ) -> entry ) == style_entree_formulaire[ENCLAIR] )    {	struct struct_categ *categ;	if ( strlen ( tableau_char[0] ) )	{	    /* on vérifie ici si c'est un virement */	    if ( strcmp ( tableau_char[0],			  _("Transfer") ) )	    {		/* ce n'est pas un virement, recherche les catég */		/* si c'est une modif d'opé et que l'ancienne opé était un virement */		/* on marque cette opé comme supprimée et on en fait une nouvelle */		if ( modification		     &&		     operation -> relation_no_operation )		{		    operation -> supprime = 1;		    operation = calloc ( 1,					 sizeof ( struct struct_ope_ventil ));		    modification = 0;		    perte_ligne_selectionnee = 1;		}		/* recherche des catégories */		categ = categ_par_nom ( tableau_char[0],					1,					operation -> montant < 0,					0 );		if ( categ )		{		    struct struct_sous_categ *sous_categ;		    operation -> categorie = categ -> no_categ;		    sous_categ = sous_categ_par_nom ( categ,						      tableau_char[1],						      1 );		    if ( sous_categ )			operation -> sous_categorie = sous_categ -> no_sous_categ;		}	    }	    else	    {		/* c'est un virement */		/* si c'est une nouvelle opé, on est content et on prend juste le compte de virement */		/* si c'est une modif d'opé et que l'ancienne n'était pas un virement, idem */		/* si l'ancienne était un virement vers le même compte, idem */		/* si l'ancienne était un virement vers un autre compte, c'est qu'on cherche les bugs ... */		/* dans ce cas, on marque l'opé comme supprimée et on en recrée une nouvelle */		/* le no de compte du virement est déjà dans compte_vire */		if ( modification		     &&		     operation -> relation_no_operation != -1		     &&		     operation -> relation_no_compte != compte_vire )		{		    /* on supprime donc l'opé et en crée une nouvelle */		    operation -> supprime = 1;		    operation = calloc ( 1,					 sizeof ( struct struct_ope_ventil ));		    modification = 0;		    perte_ligne_selectionnee = 1;		}		/* on met les no de categ à 0 */		operation -> categorie = 0;		operation -> sous_categorie = 0;		/* on met le compte en relation si c'est une nouvelle opération */		if ( !modification )		    operation -> relation_no_operation = -1;		operation -> relation_no_compte = compte_vire;	    }	}	/*       on peut maintenant libérer la variable tableau_char, qui ne sera plus utilisée */	g_strfreev ( tableau_char );    }    else    {	/* il n'y a aucune catég, si c'est une modif d'opé et que cette opé était un virement, */	/* on marque cette opé comme supprimée et on en recrée une nouvelle */	if ( modification	     &&	     operation -> relation_no_operation )	{	    operation -> supprime = 1;	    operation = calloc ( 1,				 sizeof ( struct struct_ope_ventil ));	    modification = 0;	    perte_ligne_selectionnee = 1;	}    }    /* récupération du type d'opé associée s'il est affiché */    if ( GTK_WIDGET_VISIBLE ( widget_formulaire_ventilation_echeances[SCHEDULER_BREAKDOWN_FORM_CONTRA] ))	operation -> no_type_associe = GPOINTER_TO_INT ( gtk_object_get_data ( GTK_OBJECT ( GTK_OPTION_MENU ( widget_formulaire_ventilation_echeances[SCHEDULER_BREAKDOWN_FORM_CONTRA] ) -> menu_item ),									       "no_type" ));    /* récupération des notes */    if ( gtk_widget_get_style ( widget_formulaire_ventilation_echeances[SCHEDULER_BREAKDOWN_FORM_NOTES] ) == style_entree_formulaire[ENCLAIR] )	operation -> notes = g_strdup ( g_strstrip ( (char *) gtk_entry_get_text ( GTK_ENTRY ( widget_formulaire_ventilation_echeances[SCHEDULER_BREAKDOWN_FORM_NOTES] ))));    else	operation -> notes = NULL;    /* récupération du montant */    if ( gtk_widget_get_style ( widget_formulaire_ventilation_echeances[SCHEDULER_BREAKDOWN_FORM_DEBIT] ) == style_entree_formulaire[ENCLAIR] )	/* c'est un débit */	operation -> montant = -calcule_total_entree ( widget_formulaire_ventilation_echeances[SCHEDULER_BREAKDOWN_FORM_DEBIT] );    else	operation -> montant = calcule_total_entree ( widget_formulaire_ventilation_echeances[SCHEDULER_BREAKDOWN_FORM_CREDIT] );    /* récupération de l'imputation budgétaire */    if ( gtk_widget_get_style ( GTK_COMBOFIX ( widget_formulaire_ventilation_echeances[SCHEDULER_BREAKDOWN_FORM_BUDGETARY] ) -> entry ) == style_entree_formulaire[ENCLAIR] )    {	struct struct_imputation *imputation;	gchar **tableau_char;	tableau_char = g_strsplit ( gtk_combofix_get_text ( GTK_COMBOFIX ( widget_formulaire_ventilation_echeances[SCHEDULER_BREAKDOWN_FORM_BUDGETARY] )),				    ":",				    2 );	imputation = imputation_par_nom ( tableau_char[0],					  1,					  operation -> montant < 0,					  0 );	if ( imputation )	{	    struct struct_sous_imputation *sous_imputation;	    operation -> imputation = imputation -> no_imputation;	    sous_imputation = sous_imputation_par_nom ( imputation,							tableau_char[1],							1 );	    if ( sous_imputation )		operation -> sous_imputation = sous_imputation -> no_sous_imputation;	    else		operation -> sous_imputation = 0;	}	else	    operation -> imputation = 0;	g_strfreev ( tableau_char );    }    /* récupération de l'exercice */    /* si l'exo est à -1, c'est que c'est sur non affiché */    /* soit c'est une modif d'opé et on touche pas à l'exo */    /* soit c'est une nouvelle opé et on met l'exo à 0 */    if ( GPOINTER_TO_INT ( gtk_object_get_data ( GTK_OBJECT ( GTK_OPTION_MENU ( widget_formulaire_ventilation_echeances[SCHEDULER_BREAKDOWN_FORM_EXERCICE] ) -> menu_item ),						 "no_exercice" )) == -1 )    {	if ( !operation -> no_operation )	    operation -> no_exercice = 0;    }    else	operation -> no_exercice = GPOINTER_TO_INT ( gtk_object_get_data ( GTK_OBJECT ( GTK_OPTION_MENU ( widget_formulaire_ventilation_echeances[SCHEDULER_BREAKDOWN_FORM_EXERCICE] ) -> menu_item ),									   "no_exercice" ));    /* récupération du no de pièce comptable */    if ( gtk_widget_get_style ( widget_formulaire_ventilation_echeances[SCHEDULER_BREAKDOWN_FORM_VOUCHER] ) == style_entree_formulaire[ENCLAIR] )	operation -> no_piece_comptable = g_strdup ( g_strstrip ( (char *) gtk_entry_get_text ( GTK_ENTRY ( widget_formulaire_ventilation_echeances[SCHEDULER_BREAKDOWN_FORM_VOUCHER] ))));    else	operation -> no_piece_comptable = NULL;    /* on a rempli l'opération, on l'ajoute à la liste */    /* si c'est pas une modif */    if ( !modification )    {	GSList *liste_struct_ventilations;	/* récupération de la liste de ventilations */	liste_struct_ventilations = gtk_object_get_data ( GTK_OBJECT ( formulaire_echeancier ),							  "liste_adr_ventilation" );	/*   si cette liste est à -1 (ce qui veut dire qu'elle est nulle en réalité mais */	/* qu'elle a déjà été éditée ), on la met à 0 */	if ( liste_struct_ventilations == GINT_TO_POINTER ( -1 ))	    liste_struct_ventilations = NULL;	/* on ajoute l'opé */	liste_struct_ventilations = g_slist_append ( liste_struct_ventilations,						     operation );	gtk_object_set_data ( GTK_OBJECT ( formulaire_echeancier ),			      "liste_adr_ventilation",			      liste_struct_ventilations );    }    /*   si perte_ligne_selectionnee = 1, c'est qu'au lieu de modifier une opé (virement), on l'a */    /* effacé puis recréé une nouvelle. comme ça se fait que lors d'une modif d'opé, on remet */    /* la selection sur cette nouvelle opé */    if ( perte_ligne_selectionnee == 1 )	ligne_selectionnee_ventilation_echeances = operation;    if ( mise_a_jour_combofix_categ_necessaire )	mise_a_jour_combofix_categ ();    if ( mise_a_jour_combofix_imputation_necessaire )	mise_a_jour_combofix_imputation ();    /* on met à jour la liste des ventilations */    affiche_liste_ventilation_echeances ();    /* efface le formulaire_echeancier et prépare l'opé suivante */    echap_formulaire_ventilation_echeances ();    if ( modification )	gtk_widget_grab_focus ( liste_echeances_ventilees );    else    {	clique_champ_formulaire_ventilation_echeances ();	gtk_widget_grab_focus ( GTK_COMBOFIX ( widget_formulaire_ventilation_echeances[SCHEDULER_BREAKDOWN_FORM_CATEGORY] ) -> entry );    }}