rem: gchar **tableau_char;  gtk_widget_hide ( widget_formulaire_par_element (TRANSACTION_FORM_BREAKDOWN) );
add: gchar **tab_char;
context: gboolean entree_perd_focus ( GtkWidget *entree,			     GdkEventFocus *ev,			     gint *no_origine ){    gchar *texte;    /*     on retire la sélection */    gtk_editable_select_region ( GTK_EDITABLE ( entree ),				 0,				 0 );    /*     on efface la popup du combofix si elle est affichée(arrive parfois pas trouvé pourquoi) */    if ( GPOINTER_TO_INT ( no_origine ) == TRANSACTION_FORM_PARTY	 ||	 GPOINTER_TO_INT ( no_origine ) == TRANSACTION_FORM_CATEGORY	 ||	 GPOINTER_TO_INT ( no_origine ) == TRANSACTION_FORM_BUDGET )    {	GtkWidget *combofix;	combofix = widget_formulaire_par_element ( GPOINTER_TO_INT ( no_origine ));	gtk_grab_remove ( GTK_COMBOFIX ( combofix ) -> popup );	gdk_pointer_ungrab ( GDK_CURRENT_TIME );	gtk_widget_hide ( GTK_COMBOFIX ( combofix ) ->popup );    }    texte = NULL;    switch ( GPOINTER_TO_INT ( no_origine ) )    {	/* on sort de la date, soit c'est vide, soit on la vérifie,	   la complète si nécessaire et met à jour l'exercice */	case TRANSACTION_FORM_DATE :	    if ( strlen ( g_strstrip ( (gchar *) gtk_entry_get_text ( GTK_ENTRY ( entree )))))	    {		modifie_date ( entree );		/* si c'est une modif d'opé, on ne change pas l'exercice */		/* 		si on n'utilise pas l'exo, la fonction ne fera rien */		if ( !gtk_object_get_data ( GTK_OBJECT ( formulaire ),					    "adr_struct_ope" ))		    affiche_exercice_par_date( widget_formulaire_par_element (TRANSACTION_FORM_DATE),					       widget_formulaire_par_element (TRANSACTION_FORM_EXERCICE) );	    }	    else		texte = _("Date");	    break;	    /* on sort du tiers : soit vide soit complète le reste de l'opé */	case TRANSACTION_FORM_PARTY :	    if ( !completion_operation_par_tiers ( entree ))		texte = _("Third party");	    break;	    /* on sort du débit : soit vide, soit change le menu des types s'il ne correspond pas */	case TRANSACTION_FORM_DEBIT :	    if ( strlen ( g_strstrip ( (gchar *) gtk_entry_get_text ( GTK_ENTRY ( entree )))))	    {		/* on commence par virer ce qu'il y avait dans les crédits */		if ( gtk_widget_get_style ( widget_formulaire_par_element (TRANSACTION_FORM_CREDIT) ) == style_entree_formulaire[ENCLAIR] )		{		    gtk_entry_set_text ( GTK_ENTRY ( widget_formulaire_par_element (TRANSACTION_FORM_CREDIT) ),					 "" );		    entree_perd_focus ( widget_formulaire_par_element (TRANSACTION_FORM_CREDIT),					NULL,					GINT_TO_POINTER ( TRANSACTION_FORM_CREDIT ) );		}		/* si c'est un menu de crédit, on y met le menu de débit */		if ( verifie_element_formulaire_existe ( TRANSACTION_FORM_TYPE ))		{		    if ( ( GTK_WIDGET_VISIBLE ( widget_formulaire_par_element (TRANSACTION_FORM_TYPE) )			   &&			   GPOINTER_TO_INT ( gtk_object_get_data ( GTK_OBJECT ( GTK_OPTION_MENU ( widget_formulaire_par_element (TRANSACTION_FORM_TYPE) ) -> menu ),								   "signe_menu" ))			   ==			   2 )			 ||			 !GTK_WIDGET_VISIBLE ( widget_formulaire_par_element (TRANSACTION_FORM_TYPE) ))		    {			/* on crée le nouveau menu et on met le défaut */			GtkWidget *menu;			if ( ( menu = creation_menu_types ( 1, compte_courant, 0  )))			{			    gtk_option_menu_set_menu ( GTK_OPTION_MENU ( widget_formulaire_par_element (TRANSACTION_FORM_TYPE) ),						       menu );			    gtk_option_menu_set_history ( GTK_OPTION_MENU ( widget_formulaire_par_element (TRANSACTION_FORM_TYPE) ),							  cherche_no_menu_type ( gsb_account_get_default_debit (compte_courant) ) );			    gtk_widget_show ( widget_formulaire_par_element (TRANSACTION_FORM_TYPE) );			}			else			{			    gtk_widget_hide ( widget_formulaire_par_element (TRANSACTION_FORM_TYPE) );			    gtk_widget_hide ( widget_formulaire_par_element (TRANSACTION_FORM_CHEQUE) );			}			/* comme il y a eu un changement de signe, on change aussi le type de l'opé associée */			/* s'il est affiché */			if ( verifie_element_formulaire_existe ( TRANSACTION_FORM_CONTRA )			     &&			     GTK_WIDGET_VISIBLE ( widget_formulaire_par_element (TRANSACTION_FORM_CONTRA) )			     &&			     GPOINTER_TO_INT ( gtk_object_get_data ( GTK_OBJECT ( GTK_OPTION_MENU ( widget_formulaire_par_element (TRANSACTION_FORM_CONTRA) ) -> menu ),								     "signe_menu" ))			     ==			     1 )			{			    GtkWidget *menu;			    menu = creation_menu_types ( 2,							 GPOINTER_TO_INT ( gtk_object_get_data ( GTK_OBJECT ( widget_formulaire_par_element (TRANSACTION_FORM_CONTRA) ),												 "compte_virement" )),							 2  );			    if ( menu )				gtk_option_menu_set_menu ( GTK_OPTION_MENU ( widget_formulaire_par_element (TRANSACTION_FORM_CONTRA) ),							   menu );			    else				gtk_option_menu_remove_menu ( GTK_OPTION_MENU ( widget_formulaire_par_element (TRANSACTION_FORM_CONTRA) ));			}		    }			    else		    {			/* on n'a pas recréé de menu, donc soit c'est déjà un menu de débit, soit tous les types */			/* sont affichés, soit le widget n'est pas visible */			/* on met donc le défaut, sauf si il y a qque chose dans les categ ou que le widget n'est pas visible */			if ( GTK_WIDGET_VISIBLE ( widget_formulaire_par_element (TRANSACTION_FORM_TYPE) )			     &&			     ( !verifie_element_formulaire_existe ( TRANSACTION_FORM_CATEGORY )			       ||			       gtk_widget_get_style ( widget_formulaire_par_element (TRANSACTION_FORM_CATEGORY) ) == style_entree_formulaire[ENGRIS] ))			    gtk_option_menu_set_history ( GTK_OPTION_MENU ( widget_formulaire_par_element (TRANSACTION_FORM_TYPE) ),							  cherche_no_menu_type ( gsb_account_get_default_debit (compte_courant) ) );		    }		}	    }	    else		texte = _("Debit");	    break;	    /* on sort du crédit : soit vide, soit change le menu des types	       s'il n'y a aucun tiers ( <=> nouveau tiers ) */	case TRANSACTION_FORM_CREDIT :	    if ( strlen ( g_strstrip ( (gchar *) gtk_entry_get_text ( GTK_ENTRY ( entree )))))	    {		/* on commence par virer ce qu'il y avait dans les débits */		if ( gtk_widget_get_style ( widget_formulaire_par_element (TRANSACTION_FORM_DEBIT) ) == style_entree_formulaire[ENCLAIR] )		{		    gtk_entry_set_text ( GTK_ENTRY ( widget_formulaire_par_element (TRANSACTION_FORM_DEBIT) ),					 "" );		    entree_perd_focus ( widget_formulaire_par_element (TRANSACTION_FORM_DEBIT),					NULL,					GINT_TO_POINTER ( TRANSACTION_FORM_DEBIT ));		}		/* si c'est un menu de crédit, on y met le menu de débit,		   sauf si tous les types sont affichés */		if ( verifie_element_formulaire_existe ( TRANSACTION_FORM_TYPE ))		{		    if ( ( GTK_WIDGET_VISIBLE ( widget_formulaire_par_element (TRANSACTION_FORM_TYPE) )			   &&			   GPOINTER_TO_INT ( gtk_object_get_data ( GTK_OBJECT ( GTK_OPTION_MENU ( widget_formulaire_par_element (TRANSACTION_FORM_TYPE) ) -> menu ),								   "signe_menu" )) == 1 ) ||			 !GTK_WIDGET_VISIBLE ( widget_formulaire_par_element (TRANSACTION_FORM_TYPE) ))		    {			/* on crée le nouveau menu et on met le défaut */			GtkWidget *menu;			if ( ( menu = creation_menu_types ( 2, compte_courant, 0  ) ) )			{			    gtk_option_menu_set_menu ( GTK_OPTION_MENU ( widget_formulaire_par_element (TRANSACTION_FORM_TYPE) ),						       menu );			    gtk_option_menu_set_history ( GTK_OPTION_MENU ( widget_formulaire_par_element (TRANSACTION_FORM_TYPE) ),							  cherche_no_menu_type ( gsb_account_get_default_credit (compte_courant) ) );			    gtk_widget_show ( widget_formulaire_par_element (TRANSACTION_FORM_TYPE) );			}			else			{			    gtk_widget_hide ( widget_formulaire_par_element (TRANSACTION_FORM_TYPE) );			    gtk_widget_hide ( widget_formulaire_par_element (TRANSACTION_FORM_CHEQUE) );			}			/* comme il y a eu un changement de signe, on change aussi le type de l'opé associée */			/* s'il est affiché */			if ( verifie_element_formulaire_existe ( TRANSACTION_FORM_CONTRA )			     &&			     GTK_WIDGET_VISIBLE ( widget_formulaire_par_element (TRANSACTION_FORM_CONTRA) )			     &&			     GPOINTER_TO_INT ( gtk_object_get_data ( GTK_OBJECT ( GTK_OPTION_MENU ( widget_formulaire_par_element (TRANSACTION_FORM_CONTRA) ) -> menu ),								     "signe_menu" )) == 2 )			{			    GtkWidget *menu;			    menu = creation_menu_types ( 1,							 GPOINTER_TO_INT ( gtk_object_get_data ( GTK_OBJECT ( widget_formulaire_par_element (TRANSACTION_FORM_CONTRA) ),												 "compte_virement" )),							 2  );			    if ( menu )				gtk_option_menu_set_menu ( GTK_OPTION_MENU ( widget_formulaire_par_element (TRANSACTION_FORM_CONTRA) ),							   menu );			    else				gtk_option_menu_remove_menu ( GTK_OPTION_MENU ( widget_formulaire_par_element (TRANSACTION_FORM_CONTRA) ));			}		    }		    else		    {			/* on n'a pas recréé de menu, donc soit c'est déjà un menu de débit, soit tous les types */			/* sont affichés, soit le widget n'est pas visible */			/* on met donc le défaut, sauf si il y a qque chose dans les categ ou que le widget n'est pas visible */			if ( GTK_WIDGET_VISIBLE ( widget_formulaire_par_element (TRANSACTION_FORM_TYPE) )			     &&			     ( !verifie_element_formulaire_existe ( TRANSACTION_FORM_CATEGORY )			       ||			       gtk_widget_get_style ( widget_formulaire_par_element (TRANSACTION_FORM_CATEGORY) ) == style_entree_formulaire[ENGRIS] ))			    gtk_option_menu_set_history ( GTK_OPTION_MENU ( widget_formulaire_par_element (TRANSACTION_FORM_TYPE) ),							  cherche_no_menu_type ( gsb_account_get_default_credit (compte_courant) ) );		    }		}	    }	    else		texte = _("Credit");	    break;	case TRANSACTION_FORM_VALUE_DATE :	    if ( strlen ( g_strstrip ( (gchar *) gtk_entry_get_text ( GTK_ENTRY ( entree )))))		modifie_date ( entree );	    else		texte = _("Value date");	    break;	    /* sort des catégories : si c'est une opé ventilée, affiche le bouton de ventilation */	    /* si c'est un virement affiche le bouton des types de l'autre compte */	case TRANSACTION_FORM_CATEGORY :	    if ( strlen ( g_strstrip ( (gchar *) gtk_entry_get_text ( GTK_ENTRY ( entree )))))	    {		if ( strcmp ( g_strstrip ( gtk_combofix_get_text ( GTK_COMBOFIX ( widget_formulaire_par_element (TRANSACTION_FORM_CATEGORY) ))),			      _("Breakdown of transaction") ))		{		    gchar **tableau_char;		    gtk_widget_hide ( widget_formulaire_par_element (TRANSACTION_FORM_BREAKDOWN) );		    if ( verifie_element_formulaire_existe ( TRANSACTION_FORM_EXERCICE ))			gtk_widget_set_sensitive ( widget_formulaire_par_element (TRANSACTION_FORM_EXERCICE),						   TRUE );		    if ( verifie_element_formulaire_existe ( TRANSACTION_FORM_BUDGET ))			gtk_widget_set_sensitive ( widget_formulaire_par_element (TRANSACTION_FORM_BUDGET),						   TRUE );		    /* vérification que ce n'est pas un virement */		    tableau_char = g_strsplit ( gtk_combofix_get_text ( GTK_COMBOFIX ( widget_formulaire_par_element (TRANSACTION_FORM_CATEGORY) )),						":",						2 );		    tableau_char[0] = g_strstrip ( tableau_char[0] );		    if ( tableau_char[1] )			tableau_char[1] = g_strstrip ( tableau_char[1] );		    if ( strlen ( tableau_char[0] ) )		    {			if ( !strcmp ( tableau_char[0],				       _("Transfer") )			     && tableau_char[1]			     && strlen ( tableau_char[1] ) )			{			    /* c'est un virement : on recherche le compte associé et on affiche les types de paiement */			    if ( strcmp ( tableau_char[1],					  _("Deleted account") ) )			    {				/* recherche le no de compte du virement */				gint compte_virement;				GSList *list_tmp;				compte_virement = -1;				list_tmp = list_struct_accounts;				while ( list_tmp )				{				    gint i;				    i = gsb_account_get_no_account ( list_tmp -> data );				    if ( !g_strcasecmp ( gsb_account_get_name (i),							 tableau_char[1] ) )					compte_virement = i;				    list_tmp = list_tmp -> next;				}				/* si on a touvé un compte de virement, que celui ci n'est pas le compte */				/* courant et que son menu des types n'est pas encore affiché, on crée le menu */				if ( compte_virement != -1				     &&				     compte_virement != compte_courant				     &&				     verifie_element_formulaire_existe ( TRANSACTION_FORM_CONTRA ))				{				    /* si le menu affiché est déjà celui du compte de virement, on n'y touche pas */				    if ( !GTK_WIDGET_VISIBLE ( widget_formulaire_par_element (TRANSACTION_FORM_CONTRA) )					 ||					 ( recupere_no_compte ( widget_formulaire_par_element (TRANSACTION_FORM_CONTRA) )					   !=					   compte_virement ))				    {					/* vérifie quel est le montant entré, affiche les types opposés de l'autre compte */					GtkWidget *menu;					if ( gtk_widget_get_style ( widget_formulaire_par_element (TRANSACTION_FORM_CREDIT) ) == style_entree_formulaire[ENCLAIR] )					    /* il y a un montant dans le crédit */					    menu = creation_menu_types ( 1, compte_virement, 2  );					else					    /* il y a un montant dans le débit ou défaut */					    menu = creation_menu_types ( 2, compte_virement, 2  );					/* si un menu à été créé, on l'affiche */					if ( menu )					{					    gtk_option_menu_set_menu ( GTK_OPTION_MENU ( widget_formulaire_par_element (TRANSACTION_FORM_CONTRA) ),								       menu );					    gtk_widget_show ( widget_formulaire_par_element (TRANSACTION_FORM_CONTRA) );					}					/* on associe le no de compte de virement au formulaire pour le retrouver */					/* rapidement s'il y a un chgt débit/crédit */					gtk_object_set_data ( GTK_OBJECT ( widget_formulaire_par_element (TRANSACTION_FORM_CONTRA) ),							      "compte_virement",							      GINT_TO_POINTER ( compte_virement ));				    }				}				else				    if ( verifie_element_formulaire_existe ( TRANSACTION_FORM_CONTRA ))					gtk_widget_hide ( widget_formulaire_par_element (TRANSACTION_FORM_CONTRA) );			    }			    else				if ( verifie_element_formulaire_existe ( TRANSACTION_FORM_CONTRA ))				    gtk_widget_hide ( widget_formulaire_par_element (TRANSACTION_FORM_CONTRA) );			}			else			    if ( verifie_element_formulaire_existe ( TRANSACTION_FORM_CONTRA ))				gtk_widget_hide ( widget_formulaire_par_element (TRANSACTION_FORM_CONTRA) );		    }		    else			if ( verifie_element_formulaire_existe ( TRANSACTION_FORM_CONTRA ))			    gtk_widget_hide ( widget_formulaire_par_element (TRANSACTION_FORM_CONTRA) );		    g_strfreev ( tableau_char );		}		else		{		    gtk_widget_show ( widget_formulaire_par_element (TRANSACTION_FORM_BREAKDOWN) );		    if ( verifie_element_formulaire_existe ( TRANSACTION_FORM_EXERCICE ))			gtk_widget_set_sensitive ( widget_formulaire_par_element (TRANSACTION_FORM_EXERCICE),						   FALSE );		    if ( verifie_element_formulaire_existe ( TRANSACTION_FORM_BUDGET ))			gtk_widget_set_sensitive ( widget_formulaire_par_element (TRANSACTION_FORM_BUDGET),						   FALSE );		}	    }	    else		texte = _("Categories : Sub-categories");	    break;	case TRANSACTION_FORM_CHEQUE :	    if ( !strlen ( g_strstrip ( (gchar *) gtk_entry_get_text ( GTK_ENTRY ( entree )))))		texte = _("Cheque/Transfer number");	    break;	case TRANSACTION_FORM_BUDGET :	    if ( !strlen ( g_strstrip ( (gchar *) gtk_entry_get_text ( GTK_ENTRY ( entree )))))		texte = _("Budgetary line");	    break;	case TRANSACTION_FORM_VOUCHER :	    if ( !strlen ( g_strstrip ( (gchar *) gtk_entry_get_text ( GTK_ENTRY ( entree )))))		texte = _("Voucher");	    break;	case TRANSACTION_FORM_NOTES :	    if ( !strlen ( g_strstrip ( (gchar *) gtk_entry_get_text ( GTK_ENTRY ( entree )))))		texte = _("Notes");	    break;	case TRANSACTION_FORM_BANK :	    if ( !strlen ( g_strstrip ( (gchar *) gtk_entry_get_text ( GTK_ENTRY ( entree )))))		texte = _("Bank references");	    break;	default :	    break;    }    /* si l'entrée était vide, on remet le défaut */    /* si l'origine était un combofix, il faut remettre le texte */    /* avec le gtk_combofix (sinon risque de complétion), donc utiliser l'origine */    if ( texte )    {	switch ( GPOINTER_TO_INT ( no_origine ))	{	    case TRANSACTION_FORM_PARTY :	    case TRANSACTION_FORM_CATEGORY :	    case TRANSACTION_FORM_BUDGET :		gtk_combofix_set_text ( GTK_COMBOFIX ( widget_formulaire_par_element (GPOINTER_TO_INT ( no_origine )) ),					texte );		break;	    default:		gtk_entry_set_text ( GTK_ENTRY ( entree ), texte );		break;	}	gtk_widget_set_style ( entree, style_entree_formulaire[ENGRIS] );    }    return FALSE;}