add: reaffiche_liste_comptes_onglet();
context: void traitement_donnees_brutes ( void ){  gint retour;  GtkWidget *dialog;  GtkWidget *label;  GSList *liste_tmp;  GtkWidget *frame;  GtkWidget *vbox;  GSList *liste_comptes_tmp;  gint nb_comptes_ajoutes;  gint nouveau_fichier;  GtkWidget *scrolled_window;  if ( !liste_comptes_qif )    return;  /* on permet ici de rcuprer d'autres comptes */  dialog = gnome_dialog_new ( _("List of the imported accounts"),			      GNOME_STOCK_BUTTON_YES,			      GNOME_STOCK_BUTTON_NO,			      GNOME_STOCK_BUTTON_CANCEL,			      NULL );  gtk_window_set_transient_for ( GTK_WINDOW ( dialog ),				 GTK_WINDOW ( window ));  gnome_dialog_set_default ( GNOME_DIALOG ( dialog ),			     0 );  if ( g_slist_length ( liste_comptes_qif ) == 1 )    label = gtk_label_new ( _("Account to import:\n") );  else    label = gtk_label_new ( _("Accounts to import:\n") );  gtk_box_pack_start ( GTK_BOX ( GNOME_DIALOG ( dialog ) -> vbox ), label,		       FALSE, FALSE, 0 );  gtk_widget_show ( label );  frame = gtk_frame_new ( NULL );  gtk_box_pack_start ( GTK_BOX ( GNOME_DIALOG ( dialog ) -> vbox ), frame,		       FALSE, FALSE, 0 );  gtk_widget_show ( frame );  scrolled_window = gtk_scrolled_window_new ( NULL, NULL );  gtk_scrolled_window_set_policy ( GTK_SCROLLED_WINDOW ( scrolled_window ),				   GTK_POLICY_AUTOMATIC,				   GTK_POLICY_AUTOMATIC );  gtk_container_add ( GTK_CONTAINER ( frame ),		      scrolled_window );  gtk_widget_show ( scrolled_window );  vbox = gtk_vbox_new ( FALSE, 10 );  gtk_container_set_border_width ( GTK_CONTAINER ( vbox ), 10 );  gtk_scrolled_window_add_with_viewport ( GTK_SCROLLED_WINDOW ( scrolled_window ),					  vbox );  gtk_widget_set_usize ( scrolled_window, 200, 200 );  gtk_widget_show ( vbox );  liste_tmp = liste_comptes_qif;  while ( liste_tmp )    {      label = gtk_label_new ( (( struct donnees_compte * )( liste_tmp -> data )) -> nom_de_compte );      gtk_misc_set_alignment ( GTK_MISC ( label ), 0, 0.5 );      gtk_box_pack_start ( GTK_BOX ( vbox ), label,			   FALSE, FALSE, 0 );      gtk_widget_show ( label );      liste_tmp = liste_tmp -> next;    }  label = gtk_label_new ( _("Import another account?") );  gtk_box_pack_start ( GTK_BOX ( GNOME_DIALOG ( dialog ) -> vbox ), label,		       FALSE, FALSE, 0 );  gtk_widget_show ( label );  retour = gnome_dialog_run_and_close ( GNOME_DIALOG ( dialog ));  /*   si on veut importer un autre compte, on renvoie sur selection_fichier_qif */  if ( !retour )    {      selection_fichier_qif();      return;    }  /*   si on annule : on s'en va */  if ( retour == 2 )    return;  /* on ralise maintenant les transformations pour importer les fichiers *//* fait le ncessaire si aucun compte n'est ouvert */  if ( nb_comptes )      nouveau_fichier = 0;  else    {      init_variables ( FALSE );      init_variables ( TRUE );      creation_liste_categories ();      creation_devises_de_base ();      nom_fichier_comptes = NULL;      nouveau_fichier = 1;      affiche_titre_fenetre();      /*   la taille des colonnes est automatique au dpart, on y met les rapports de base */      etat.largeur_auto_colonnes = 1;      rapport_largeur_colonnes[0] = 11;      rapport_largeur_colonnes[1] = 13;      rapport_largeur_colonnes[2] = 30;      rapport_largeur_colonnes[3] = 3;      rapport_largeur_colonnes[4] = 11;      rapport_largeur_colonnes[5] = 11;      rapport_largeur_colonnes[6] = 11;    }  /* on commence par enregistrer les comptes */  nb_comptes_ajoutes = 0;  liste_comptes_tmp = liste_comptes_qif;  while ( liste_comptes_tmp )    {      struct donnees_compte *compte;      GtkWidget *bouton;      gint compte_visible;      compte = liste_comptes_tmp -> data;      /* enregistre le compte */      compte_visible = p_tab_nom_de_compte_courant - p_tab_nom_de_compte;      p_tab_nom_de_compte = realloc ( p_tab_nom_de_compte, ( nb_comptes + 1 )* sizeof ( gpointer ) );      p_tab_nom_de_compte_variable = p_tab_nom_de_compte + nb_comptes;      nb_comptes++;      *p_tab_nom_de_compte_variable = (gpointer) compte;      p_tab_nom_de_compte_courant = p_tab_nom_de_compte + compte_visible;       /* choix de la devise du compte */      compte -> devise = selection_devise ( compte -> nom_de_compte );      /* met le no de compte */      compte -> no_compte = nb_comptes - 1;      ordre_comptes = g_slist_append ( ordre_comptes,				       GINT_TO_POINTER ( nb_comptes - 1 ));      /* on cre les types d'op par dfaut */      creation_types_par_defaut ( nb_comptes - 1,				  0);      if ( !nouveau_fichier )	{	  /* cre le nouveau bouton du compte et l'ajoute  la liste des comptes */	  bouton = comptes_appel(nb_comptes - 1 );	  gtk_box_pack_start (GTK_BOX (vbox_liste_comptes),			      bouton,			      FALSE,			      FALSE,			      0);	  gtk_widget_show (bouton);	}      nb_comptes_ajoutes++;      liste_comptes_tmp = liste_comptes_tmp -> next;    }  p_tab_nom_de_compte_courant = p_tab_nom_de_compte + compte_courant;  /* on fait maintenant le tour des ops et cette fois on les convertit */  liste_comptes_tmp = liste_comptes_qif;  while ( liste_comptes_tmp )    {      struct donnees_compte *compte;      gdouble solde_courant;      struct structure_operation *operation;      gint format_date;      GSList *save_gsliste;      gint derniere_operation;      GSList *liste_ope_brut;      derniere_operation = 0;      compte = liste_comptes_tmp -> data;      /*       au dbut, on considre que la date est sous forme jjmmaa, si pb, on passe  mmjjaa */      format_date = 0;      liste_ope_brut = compte -> gsliste_operations;      changement_format_date :      compte -> nb_operations = 0;      liste_tmp = liste_ope_brut;      save_gsliste = liste_tmp;      compte -> gsliste_operations = NULL;      solde_courant = compte -> solde_initial;      while ( liste_tmp )	{	  struct struct_operation_qif *operation_qif;	  gchar **tab_str;	  GSList *pointeur_tmp;	  operation_qif = liste_tmp -> data;	  /* 	  vrification qu'il y a une date, sinon ce n'est pas une op, on prend pas */	  if ( operation_qif -> date )	    {	      operation = calloc ( 1, sizeof ( struct structure_operation ));	      /* rcupration du no de l'op */	      operation -> no_operation = ++no_derniere_operation;	      operation -> type_ope = 0;	      /* rcupration de la date qui est du format jj/mm/aaaa ou jj/mm/aa ou jj/mm'aa  partir de 2000 */	      /* 	      si format_date = 0, c'est sous la forme jjmm sinon mmjj */	      tab_str = g_strsplit ( operation_qif -> date, "/", 3 );	      if ( tab_str [2] && tab_str [1] )		{		  /* 		  le format est xx/xx/xx, pas d'apostrophe */		  if ( format_date )		    {		      operation -> mois = my_strtod ( tab_str[0], NULL );		      operation -> jour = my_strtod ( tab_str[1], NULL );		    }		  else		    {		      operation -> jour = my_strtod ( tab_str[0], NULL );		      operation -> mois = my_strtod ( tab_str[1], NULL );		    }		  if ( strlen ( tab_str[2] ) == 4 )		    operation -> annee = my_strtod ( tab_str[2], NULL );		  else		    {		      operation -> annee = my_strtod ( tab_str[2], NULL );		      if ( operation -> annee < 80 )			operation -> annee = operation -> annee + 2000;		      else			operation -> annee = operation -> annee + 1900;		    }		}	      else		{		  if ( tab_str[1] )		    {		      /* le format est xx/xx'xx */		      gchar **tab_str2;		      tab_str2 = g_strsplit ( tab_str[1], "'", 2 );		      if ( format_date )			{			  operation -> mois = my_strtod ( tab_str[0], NULL );			  operation -> jour = my_strtod ( tab_str2[0], NULL );			}		      else			{			  operation -> jour = my_strtod ( tab_str[0], NULL );			  operation -> mois = my_strtod ( tab_str2[0], NULL );			}		      /* si on avait 'xx, en fait a peut tre 'xx ou 'xxxx ... */		      if ( strlen ( tab_str2[1] ) == 2 )			operation -> annee = my_strtod ( tab_str2[1], NULL ) + 2000;		      else			operation -> annee = my_strtod ( tab_str2[1], NULL );		      g_strfreev ( tab_str2 );		    }		  else		    {		      /* le format est aaaa-mm-jj */		      tab_str = g_strsplit ( operation_qif -> date, "-", 3 );		      operation -> mois = my_strtod ( tab_str[1], NULL );		      operation -> jour = my_strtod ( tab_str[2], NULL );		      if ( strlen ( tab_str[0] ) == 4 )			operation -> annee = my_strtod ( tab_str[0], NULL );		      else			{			  operation -> annee = my_strtod ( tab_str[0], NULL );			if ( operation -> annee < 80 )			  operation -> annee = operation -> annee + 2000;			else			  operation -> annee = operation -> annee + 1900;			}		    }		}	      g_strfreev ( tab_str );	      if ( g_date_valid_dmy ( operation -> jour,				      operation -> mois,				      operation -> annee ))		operation -> date = g_date_new_dmy ( operation -> jour,						     operation -> mois,						     operation -> annee );	      else		{		  if ( format_date )		    {		      dialogue ( _("Problem recovering the dates in the QIF file. Import canceled.") );		      return;		    }		  format_date = 1;		  goto changement_format_date;		}	      /* rcupration du no de compte ( stock pour l'instant dans no_derniere_operation ) */	      operation -> no_compte = compte->no_compte;	      /* rcupration du montant */	      operation -> montant = operation_qif -> montant;	      solde_courant = solde_courant + operation_qif -> montant;	      operation -> devise = compte -> devise;	      /* rcupration du tiers */	      if ( operation_qif -> tiers )		{		  pointeur_tmp = g_slist_find_custom ( liste_struct_tiers,						       g_strstrip ( operation_qif -> tiers ),						       (GCompareFunc) recherche_tiers_par_nom );		  /* si le tiers n'existait pas, on le cre */		  if ( pointeur_tmp )		    operation -> tiers = ((struct struct_tiers *)(pointeur_tmp -> data)) -> no_tiers;		  else		    operation -> tiers = (( struct struct_tiers * )( ajoute_nouveau_tiers ( operation_qif -> tiers ))) -> no_tiers;		}	      /* vrification si c'est ventil, sinon rcupration des catgories */	      if ( operation_qif -> operation_ventilee )		{		  /* l'opration est ventile */		  operation -> operation_ventilee = 1;		}	      else		{		  /* vrification que ce n'est pas un virement */		  if ( operation_qif -> categ && strlen ( g_strstrip (operation_qif -> categ)) )		    {		      if ( operation_qif -> categ[0] == '[' )			{			  /* recherche du compte en relation ( on cherchera l'op ensuite, une fois */			  /* que toutes les ops auront t importes */			  gint i;			  p_tab_nom_de_compte_variable = p_tab_nom_de_compte;			  for ( i = 0 ; i < nb_comptes ; i++ )			    {			      if ( !g_strcasecmp ( g_strconcat ( "[",								 NOM_DU_COMPTE,								 "]",								 NULL ),						   operation_qif -> categ ))				{				  /* on a trouv le compte, met la relation de l'op  -1 pour dire qu'il faut la chercher */				  operation -> relation_no_compte = i;				  operation -> relation_no_operation = -1;				  operation -> type_ope = 1;				}			      p_tab_nom_de_compte_variable++;			    }			}		      else			{			  struct struct_categ *categ;			  struct struct_sous_categ *sous_categ ;			  tab_str = g_strsplit ( operation_qif -> categ, ":", 2 );			  /* rcupration ou cration de la catgorie */			  if ( !g_slist_find_custom ( liste_struct_categories,						      g_strstrip ( tab_str[0] ),						      (GCompareFunc) recherche_categorie_par_nom ))			    {			      categ = calloc ( 1, sizeof ( struct struct_categ ));			      categ -> no_categ = ++no_derniere_categorie;			      categ -> nom_categ = g_strdup ( g_strstrip ( tab_str[0] ) );			      if ( operation_qif -> montant < 0 )				categ -> type_categ = 1;			      else				categ -> type_categ = 0;			      nb_enregistrements_categories++;			      liste_struct_categories = g_slist_append ( liste_struct_categories,									 categ );			    }			  else			    categ = g_slist_find_custom ( liste_struct_categories,							  g_strstrip ( tab_str[0] ),							  (GCompareFunc) recherche_categorie_par_nom ) -> data;			  operation -> categorie = categ -> no_categ;			  /* rcupration ou cration de la sous-catgorie */			  if ( tab_str[1] )			    {			      if ( !g_slist_find_custom ( categ -> liste_sous_categ,							  g_strstrip ( tab_str[1] ),							  (GCompareFunc) recherche_sous_categorie_par_nom ))				{				  sous_categ = calloc ( 1, sizeof ( struct struct_sous_categ ));				  sous_categ -> no_sous_categ = ++( categ -> no_derniere_sous_categ );				  sous_categ -> nom_sous_categ = g_strdup ( g_strstrip ( tab_str[1] ));				  categ -> liste_sous_categ = g_slist_append ( categ -> liste_sous_categ,									       sous_categ );				}			      else				sous_categ = g_slist_find_custom ( categ -> liste_sous_categ,								   g_strstrip ( tab_str[1] ),								   (GCompareFunc) recherche_sous_categorie_par_nom ) -> data;			      operation -> sous_categorie = sous_categ -> no_sous_categ;			    }			  g_strfreev ( tab_str );			}		    }		}	      /* rcupration des notes */	      operation -> notes = operation_qif -> notes;	      p_tab_nom_de_compte_variable = p_tab_nom_de_compte_courant;	      /* rcupration du chque et mise en forme du type d'opration */	      if ( operation_qif -> cheque )		{		  /* c'est un chque, on va rechercher un type  incrmentation automatique et mettre l'op sous ce type */		  /* si un tel type n'existe pas, on met quand mme le no dans contenu_type et on met le type par dfaut */		  struct struct_type_ope *type_choisi;		  GSList *liste_tmp;		  if ( operation -> montant < 0 )		    operation -> type_ope = TYPE_DEFAUT_DEBIT;		  else		    operation -> type_ope = TYPE_DEFAUT_CREDIT;		  operation -> contenu_type = itoa ( operation_qif -> cheque );		  liste_tmp = TYPES_OPES;		  type_choisi = NULL;		  while ( liste_tmp )		    {		      struct struct_type_ope *type;		      type = liste_tmp -> data;		      /* si l'op on trouve un type  incrmentation			 automatique et que le signe du type est bon,			 on l'enregistre et on arrte la recherche,			 sinon, on l'enregistre mais on continue la			 recherche dans l'espoir de mieux */		      if ( type -> numerotation_auto )			{			  if ( !type -> signe_type			       ||			       ( type -> signe_type == 1 && operation -> montant < 0 )			       ||			       ( type -> signe_type == 2 && operation -> montant > 0 ))			    {			      operation -> type_ope = type -> no_type;			      type_choisi = type;			      liste_tmp = NULL;			    }			  else			    {			      operation -> type_ope = type -> no_type;			      type_choisi = type;			      liste_tmp = liste_tmp -> next;			    }			}		      else			liste_tmp = liste_tmp -> next;		    }		  /* type_choisi contient l'adr du type qui a t utilis, on peut y mettre le dernier no de chque */		  if ( type_choisi )		    type_choisi -> no_en_cours = MAX ( operation_qif -> cheque,						       type_choisi -> no_en_cours );		}	      else		{		  /* comme ce n'est pas un chque, on met sur le type par dfaut */		  if ( operation -> type_ope != 1 )		    {		      if ( operation -> montant < 0 )			operation -> type_ope = TYPE_DEFAUT_DEBIT;		      else			operation -> type_ope = TYPE_DEFAUT_CREDIT;		    }		}	      /* rcupration du point */	      operation -> pointe = operation_qif -> p_r;	      /* si c'est une ope de ventilation, lui ajoute le no de l'opration prcdente */	      if ( operation_qif -> ope_de_ventilation )		operation -> no_operation_ventilee_associee = derniere_operation;	      else		derniere_operation = operation -> no_operation;	      /* ajoute l'opration dans la liste des ops du compte */	      compte -> gsliste_operations = g_slist_append ( compte -> gsliste_operations,							      operation );	      compte -> nb_operations++;	    }	  liste_tmp = liste_tmp -> next;	}      compte -> nb_lignes_ope = 3;      compte -> solde_courant = solde_courant;      compte -> date_releve = NULL;      compte -> operation_selectionnee = GINT_TO_POINTER ( -1 );      liste_comptes_tmp = liste_comptes_tmp -> next;    }  /* on fait maintenant le lien entre les diffrents virements : */  /* on fait le tour de toutes les ops des comptes ajouts, */  /* si une op  un relation_no_operation  -1 , */  /* on recherche dans le compte associ une op avec aussi une relation_no_operation  -1  */  /* le mme jour avec le mme tiers */  liste_comptes_tmp = liste_comptes_qif;  while ( liste_comptes_tmp )    {      struct donnees_compte *compte;      struct structure_operation *operation;      compte = liste_comptes_tmp -> data;      liste_tmp = compte -> gsliste_operations;      while ( liste_tmp )	{	  operation = liste_tmp -> data;	  if ( operation -> relation_no_operation == -1 )	    {	      GSList *pointeur_tmp;	      p_tab_nom_de_compte_variable = p_tab_nom_de_compte + operation -> relation_no_compte;	      pointeur_tmp = LISTE_OPERATIONS;	      while ( pointeur_tmp )		{		  struct structure_operation *operation_2;		  operation_2 = pointeur_tmp -> data;		  if ( operation_2 -> relation_no_operation == -1 )		    {		      if ( !g_date_compare ( operation -> date, operation_2 -> date )			   &&			   ( operation -> tiers == operation_2 -> tiers )			   &&			   ( fabs ( operation -> montant ) == fabs ( operation_2 -> montant ) ))			{			  operation -> relation_no_operation = operation_2 -> no_operation;			  operation_2 -> relation_no_operation = operation -> no_operation;			}		    }		  pointeur_tmp = pointeur_tmp -> next;		}	    }	  liste_tmp = liste_tmp -> next;	}      liste_comptes_tmp = liste_comptes_tmp -> next;    }  /* cration des listes d'op */  mise_en_route_attente ( _("Processing the information can be long...") );  if ( nouveau_fichier )    {      creation_fenetre_principale();      creation_listes_operations ();      changement_compte ( GINT_TO_POINTER ( compte_courant ) );      gtk_notebook_set_page ( GTK_NOTEBOOK ( notebook_general ), 0 );    }  else    while ( nb_comptes_ajoutes )      {	/* trie la liste */	p_tab_nom_de_compte_variable = p_tab_nom_de_compte + nb_comptes - nb_comptes_ajoutes;	LISTE_OPERATIONS = g_slist_sort ( LISTE_OPERATIONS,					  ( GCompareFunc ) comparaison_date_list_ope );	ajoute_nouvelle_liste_operation( nb_comptes - nb_comptes_ajoutes );	nb_comptes_ajoutes--;	p_tab_nom_de_compte_variable = p_tab_nom_de_compte + compte_courant;	MISE_A_JOUR = 1;      }  /* on recre les combofix des tiers et des catgories */  mise_a_jour_tiers ();  mise_a_jour_categ();/* on met  jour l'option menu du formulaire des chances */  gtk_option_menu_set_menu ( GTK_OPTION_MENU ( widget_formulaire_echeancier[5] ),			     creation_option_menu_comptes (changement_choix_compte_echeancier, TRUE) );  /* mise  jour de l'accueil */  update_liste_comptes_accueil ();  mise_a_jour_soldes_minimaux ();  affiche_titre_fenetre ();  annulation_attente();  gnome_app_set_contents ( GNOME_APP ( window ), 			   notebook_general );  modification_fichier ( TRUE );}