1 /* ************************************************************************** */
2 /*                                                                            */
3 /*     Copyright (C)    2000-2008 Cédric Auger (cedric@grisbi.org)            */
4 /*          2003-2008 Benjamin Drieu (bdrieu@april.org)	                      */
5 /*          2009-2018 Pierre Biava (grisbi@pierre.biava.name)                 */
6 /*          https://www.grisbi.org/                                            */
7 /*                                                                            */
8 /*  This program is free software; you can redistribute it and/or modify      */
9 /*  it under the terms of the GNU General Public License as published by      */
10 /*  the Free Software Foundation; either version 2 of the License, or         */
11 /*  (at your option) any later version.                                       */
12 /*                                                                            */
13 /*  This program is distributed in the hope that it will be useful,           */
14 /*  but WITHOUT ANY WARRANTY; without even the implied warranty of            */
15 /*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             */
16 /*  GNU General Public License for more details.                              */
17 /*                                                                            */
18 /*  You should have received a copy of the GNU General Public License         */
19 /*  along with this program; if not, write to the Free Software               */
20 /*  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
21 /*                                                                            */
22 /* ************************************************************************** */
23 
24 /**
25  * \file tiers_onglet.c
26  * deal with the payee page
27  */
28 
29 
30 
31 #ifdef HAVE_CONFIG_H
32 #include "config.h"
33 #endif
34 
35 #include "include.h"
36 #include <glib/gi18n.h>
37 
38 #include "dialog.h"
39 
40 /*START_INCLUDE*/
41 #include "tiers_onglet.h"
42 #include "grisbi_app.h"
43 #include "gsb_assistant.h"
44 #include "gsb_automem.h"
45 #include "gsb_combo_box.h"
46 #include "gsb_data_form.h"
47 #include "gsb_data_mix.h"
48 #include "gsb_data_payee.h"
49 #include "gsb_data_scheduled.h"
50 #include "gsb_data_transaction.h"
51 #include "gsb_file.h"
52 #include "gsb_form_widget.h"
53 #include "gsb_transactions_list.h"
54 #include "gtk_combofix.h"
55 #include "import.h"
56 #include "meta_payee.h"
57 #include "metatree.h"
58 #include "navigation.h"
59 #include "structures.h"
60 #include "traitement_variables.h"
61 #include "transaction_list.h"
62 #include "utils.h"
63 #include "utils_buttons.h"
64 #include "utils_editables.h"
65 #include "utils_str.h"
66 #include "erreur.h"
67 /*END_INCLUDE*/
68 
69 /*START_STATIC*/
70 static GtkWidget *payee_toolbar;
71 static GtkWidget *payee_tree = NULL;
72 static GtkTreeStore *payee_tree_model = NULL;
73 
74 /* variable for display payees without transactions */
75 static gboolean display_unused_payees;
76 
77 /* variable for the management of the cancelled edition */
78 static gboolean sortie_edit_payee = FALSE;
79 
80 /* structure pour la sauvegarde de la position */
81 static struct MetatreeHoldPosition *payee_hold_position;
82 
83 /* structure pour la sauvegarde de la valeur default_answer */
84 static ConditionalMsg overwrite_payee = {NULL, NULL, NULL, FALSE, FALSE};
85 /*END_STATIC*/
86 
87 /*START_EXTERN*/
88 /*END_EXTERN*/
89 
90 enum PayeesAssistantPage
91 {
92     PAYEES_ASSISTANT_INTRO= 0,
93     PAYEES_ASSISTANT_PAGE_2,
94     PAYEES_ASSISTANT_PAGE_3,
95     PAYEES_ASSISTANT_PAGE_FINISH
96 };
97 
98 enum {
99   COLUMN_BOOLEAN,
100   COLUMN_INT,
101   COLUMN_STRING,
102   N_COLUMNS
103 };
104 
105 /******************************************************************************/
106 /* Private functions                                                          */
107 /******************************************************************************/
108 /**
109  *
110  *
111  * \param
112  * \param
113  * \param
114  * \param
115  * \param
116  *
117  * \return
118  **/
payee_tree_update_transactions(GtkTreeModel * model,MetatreeInterface * iface,GtkTreeIter * iter,gint division,gchar * old_payee)119 static void payee_tree_update_transactions (GtkTreeModel *model,
120 											MetatreeInterface *iface,
121 											GtkTreeIter *iter,
122 											gint division,
123 											gchar *old_payee)
124 {
125     GtkTreeIter child_iter;
126     gchar *name;
127     gint number_transactions;
128     gint transaction_number;
129     gint i = 0;
130 
131     number_transactions = iface->div_nb_transactions (division);
132 
133     for (i = 0; i < number_transactions; i++)
134     {
135         gtk_tree_model_iter_nth_child (model, &child_iter, iter, i);
136         gtk_tree_model_get (model, &child_iter, META_TREE_TEXT_COLUMN, &name, -1);
137         if (!name)
138             return;
139         gtk_tree_model_get (model, &child_iter, META_TREE_NO_TRANSACTION_COLUMN, &transaction_number, -1);
140         name = gsb_string_remplace_string (name,
141 										   old_payee,
142 										   (gchar *) gsb_data_payee_get_name (division, FALSE));
143         gtk_tree_store_set (GTK_TREE_STORE(model), &child_iter, META_TREE_TEXT_COLUMN, name, -1);
144     }
145 }
146 
147 /**
148  *
149  *
150  * \param
151  *
152  * \return
153  **/
edit_payee(GtkTreeView * view)154 static gboolean edit_payee (GtkTreeView * view)
155 {
156     GtkWidget * dialog, *paddingbox, *table, *label, *entry_name;
157 	GtkWidget *search_entry;
158     GtkWidget *check_option_1;
159     GtkWidget *check_option_2;
160     GtkWidget *entry_description, *hbox, *scrolled_window;
161     GtkTreeSelection * selection;
162     GtkTreeModel * model = NULL;
163     GtkTreeIter *div_iter;
164     GtkTreeIter iter;
165     GtkTreePath *path;
166     gchar * title;
167     gchar * old_payee;
168     gint no_division = -1;
169     gint payee_number = 0;
170     MetatreeInterface *payee_interface;
171 
172     devel_debug (NULL);
173 
174     selection = gtk_tree_view_get_selection (view);
175     if (selection && gtk_tree_selection_get_selected(selection, &model, &iter))
176     {
177 		gtk_tree_model_get (model,
178 							&iter,
179 							META_TREE_POINTER_COLUMN, &payee_number,
180 							META_TREE_NO_DIV_COLUMN, &no_division,
181 							-1);
182     }
183 
184     if (!selection || no_division <= 0)
185         return FALSE;
186 
187     old_payee = g_strdup (gsb_data_payee_get_name (payee_number, TRUE));
188     title = g_strdup_printf (_("Properties for %s"), old_payee);
189 
190     dialog = gtk_dialog_new_with_buttons (title,
191 										  GTK_WINDOW (grisbi_app_get_active_window (NULL)),
192 										  GTK_DIALOG_MODAL,
193 										  "gtk-cancel", GTK_RESPONSE_NO,
194 										  "gtk-apply", GTK_RESPONSE_OK,
195 										  NULL);
196 
197     gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER_ON_PARENT);
198     gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
199 
200     /* Ugly dance to avoid side effects on dialog's vbox. */
201     hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
202     gtk_box_pack_start (GTK_BOX (dialog_get_content_area (dialog)), hbox, FALSE, FALSE, 0);
203     paddingbox = new_paddingbox_with_title (hbox, TRUE, title);
204     gtk_container_set_border_width (GTK_CONTAINER(hbox), MARGIN_BOX);
205     gtk_container_set_border_width (GTK_CONTAINER(paddingbox), MARGIN_BOX);
206 
207     table = gtk_grid_new ();
208     gtk_box_pack_start (GTK_BOX (paddingbox), table, FALSE, FALSE, 6);
209     gtk_grid_set_column_spacing (GTK_GRID (table), MARGIN_BOX);
210     gtk_grid_set_row_spacing (GTK_GRID (table), MARGIN_BOX);
211 
212     /* Name entry */
213     label = gtk_label_new (_("Name: "));
214     utils_labels_set_alignment (GTK_LABEL (label), 0.0, 0.5);
215     gtk_grid_attach (GTK_GRID (table), label, 0, 0, 1, 1);
216 
217     entry_name = gtk_entry_new ();
218     gtk_entry_set_text (GTK_ENTRY (entry_name),
219                         gsb_data_payee_get_name(payee_number,
220                         TRUE));
221     gtk_widget_set_size_request (entry_name, 400, -1);
222     gtk_grid_attach (GTK_GRID (table), entry_name, 1, 0, 1, 1);
223 
224     /* Description entry */
225     label = gtk_label_new (_("Description: "));
226     utils_labels_set_alignment (GTK_LABEL (label), 0.0, 0.5);
227     gtk_grid_attach (GTK_GRID (table), label, 0, 1, 1, 1);
228 
229     entry_description = gsb_editable_text_view_new (gsb_data_payee_get_description (payee_number));
230     scrolled_window = gtk_scrolled_window_new (NULL, NULL);
231     gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
232 									GTK_POLICY_AUTOMATIC,
233 									GTK_POLICY_AUTOMATIC);
234     gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(scrolled_window), GTK_SHADOW_IN);
235     gtk_container_add (GTK_CONTAINER (scrolled_window), entry_description);
236     gtk_grid_attach (GTK_GRID (table), scrolled_window, 1, 1, 1, 1);
237 
238 	/* search string */
239     label = gtk_label_new (_("Search string: "));
240     utils_labels_set_alignment (GTK_LABEL (label), 0.0, 0.5);
241     gtk_grid_attach (GTK_GRID (table), label, 0, 2, 1, 1);
242 
243 	search_entry = gtk_entry_new ();
244     gtk_entry_set_text (GTK_ENTRY (search_entry),
245                         gsb_data_payee_get_search_string (payee_number));
246     gtk_grid_attach (GTK_GRID (table), search_entry, 1, 2, 1, 1);
247 
248 	/* others options for search */
249     check_option_1 = gtk_check_button_new_with_label (_("Ignoring case sensitive"));
250 	gtk_grid_attach (GTK_GRID (table), check_option_1, 0, 3, 2, 1);
251 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_option_1), gsb_data_payee_get_ignore_case (payee_number));
252 
253 	check_option_2 = gtk_check_button_new_with_label (_("Use the regular expressions"));
254 	gtk_grid_attach (GTK_GRID (table), check_option_2, 0, 4, 2, 1);
255 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_option_2), gsb_data_payee_get_use_regex (payee_number));
256 	gtk_widget_set_sensitive (check_option_2, FALSE);
257 
258     gtk_widget_show_all (dialog);
259 
260     while (1)
261     {
262         if (gtk_dialog_run (GTK_DIALOG(dialog)) != GTK_RESPONSE_OK)
263         {
264             sortie_edit_payee = TRUE;
265             gtk_widget_destroy (GTK_WIDGET (dialog));
266             g_free (title);
267             g_free (old_payee);
268 
269             return FALSE;
270         }
271 
272         if (!gsb_data_payee_get_number_by_name (gtk_entry_get_text (
273          GTK_ENTRY (entry_name)), FALSE)
274          ||
275          gsb_data_payee_get_number_by_name (gtk_entry_get_text (
276          GTK_ENTRY (entry_name)), FALSE) == payee_number)
277         {
278             gsb_data_payee_set_name (payee_number,
279                         gtk_entry_get_text (GTK_ENTRY (entry_name)));
280             break;
281         }
282         else
283         {
284             gchar *message;
285 
286             message = g_strdup_printf (_("You tried to rename current payee to '%s' "
287                             "but this payee already exists.  Please "
288                             "choose another name."),
289                             gtk_entry_get_text (GTK_ENTRY (entry_name)));
290             dialogue_warning_hint (message, _("Payee already exists"));
291             g_free (message);
292         }
293     }
294 
295     /* get the description */
296     gsb_data_payee_set_description (payee_number,
297                         gsb_editable_text_view_get_content (entry_description));
298 
299 	/* set search options */
300 	gsb_data_payee_set_search_string (payee_number, gtk_entry_get_text (GTK_ENTRY (search_entry)));
301 	gsb_data_payee_set_ignore_case (payee_number,
302 									gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check_option_1)));
303 	gsb_data_payee_set_use_regex (payee_number,
304 								  gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check_option_2)));
305 
306     gtk_widget_destroy (dialog);
307 
308     payee_interface = payee_get_metatree_interface ();
309     div_iter = get_iter_from_div (model, payee_number, 0);
310     fill_division_row (model, payee_interface, div_iter, payee_number);
311     payee_tree_update_transactions (model, payee_interface, div_iter, payee_number, old_payee);
312 
313     /* et on centre l'affichage dessus */
314     div_iter = get_iter_from_div (model, payee_number, 0);
315     path = gtk_tree_model_get_path (GTK_TREE_MODEL (model), div_iter);
316     gtk_tree_selection_select_iter (selection, div_iter);
317     gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (payee_tree), path, NULL, TRUE, 0.5, 0.5);
318     gtk_tree_path_free (path);
319 
320     gtk_widget_grab_focus (GTK_WIDGET (view));
321     gtk_tree_iter_free (div_iter);
322     g_free (title);
323     g_free (old_payee);
324 
325     /* update the transactions list */
326     transaction_list_update_element (ELEMENT_PARTY);
327     gsb_file_set_modified (TRUE);
328     return FALSE;
329 }
330 
331 /**
332  * function to create and editing a new payee.
333  *
334  * \param the model for the division
335  *
336  * \return
337  **/
appui_sur_ajout_payee(GtkTreeModel * model)338 static void appui_sur_ajout_payee (GtkTreeModel * model)
339 {
340     metatree_new_division (model);
341     sortie_edit_payee = FALSE;
342     edit_payee (GTK_TREE_VIEW (payee_tree));
343     if (sortie_edit_payee)
344         supprimer_division (GTK_TREE_VIEW (payee_tree));
345     sortie_edit_payee = FALSE;
346 }
347 
348 /**
349  * Fill the drag & drop structure with the path of selected column.
350  * This is an interface function called from GTK, much like a callback.
351  *
352  * \param drag_source		Not used.
353  * \param path				Original path for the gtk selection.
354  * \param selection_data	A pointer to the drag & drop structure.
355  *
356  * \return FALSE, to allow future processing by the callback chain.
357  **/
payee_drag_data_get(GtkTreeDragSource * drag_source,GtkTreePath * path,GtkSelectionData * selection_data)358 static gboolean payee_drag_data_get (GtkTreeDragSource *drag_source,
359 									 GtkTreePath *path,
360 									 GtkSelectionData *selection_data)
361 {
362     if (path)
363     {
364 		gtk_tree_set_row_drag_data (selection_data, GTK_TREE_MODEL(payee_tree_model), path);
365     }
366 
367     return FALSE;
368 }
369 
370 /**
371  * called when we press a button on the list
372  *
373  * \param tree_view
374  * \param ev
375  * \param
376  *
377  * \return FALSE
378  **/
payee_list_button_press(GtkWidget * tree_view,GdkEventButton * ev,gpointer null)379 static gboolean payee_list_button_press (GtkWidget *tree_view,
380 										 GdkEventButton *ev,
381 										 gpointer null)
382 {
383     if (ev->type == GDK_2BUTTON_PRESS)
384     {
385         GtkTreeSelection *selection;
386         GtkTreeModel *model;
387         GtkTreeIter iter;
388         GtkTreePath *path = NULL;
389         enum MetaTreeRowType type_division;
390 		GrisbiAppConf *a_conf;
391 
392         type_division = metatree_get_row_type_from_tree_view (tree_view);
393         if (type_division == META_TREE_TRANSACTION)
394             return FALSE;
395 
396         selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view));
397         if (selection && gtk_tree_selection_get_selected (selection, &model, &iter))
398             path = gtk_tree_model_get_path  (model, &iter);
399 
400 		a_conf = (GrisbiAppConf *) grisbi_app_get_a_conf ();
401         if (a_conf->metatree_action_2button_press == 1)
402         {
403             edit_payee (GTK_TREE_VIEW (tree_view));
404 
405             gtk_tree_path_free (path);
406             return TRUE;
407         }
408         else
409         {
410             if (gtk_tree_view_row_expanded (GTK_TREE_VIEW (tree_view), path))
411                 gtk_tree_view_collapse_row (GTK_TREE_VIEW (tree_view), path);
412             else
413                 gtk_tree_view_expand_row (GTK_TREE_VIEW (tree_view), path, FALSE);
414 
415             gtk_tree_path_free (path);
416             return FALSE;
417         }
418 
419         return TRUE;
420     }
421     else
422         return FALSE;
423 }
424 
425 /**
426  * Fonction de callback d'affichage des tiers inutilisés
427  *
428  * \param
429  * \param
430  *
431  * \return
432  **/
payee_menu_display_unused_payees_activate(GtkWidget * item,gpointer data)433 static void payee_menu_display_unused_payees_activate (GtkWidget *item,
434 													   gpointer data)
435 {
436     display_unused_payees = gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (item));
437 
438     payees_fill_list ();
439 }
440 
441 /**
442  * Popup a menu that allow changing the view mode of the category
443  * metatree.
444  *
445  * \param button	Button that triggered the signal.
446  *
447  * \return		FALSE
448  **/
popup_payee_view_mode_menu(GtkWidget * button)449 static gboolean popup_payee_view_mode_menu (GtkWidget * button)
450 {
451     GtkWidget *menu, *menu_item;
452     gint nb_unused;
453 
454     menu = gtk_menu_new ();
455 
456     /* Edit transaction */
457     menu_item = gtk_menu_item_new_with_label (_("Payee view"));
458     g_signal_connect (G_OBJECT(menu_item),
459 					  "activate",
460 					  G_CALLBACK(expand_arbre_division),
461 					  (gpointer) 0);
462     g_object_set_data (G_OBJECT(menu_item), "tree-view", payee_tree);
463     gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
464 
465     menu_item = gtk_menu_item_new_with_label (_("Complete view"));
466     g_signal_connect (G_OBJECT(menu_item),
467 					  "activate",
468 					  G_CALLBACK(expand_arbre_division),
469 					  (gpointer) 2);
470     g_object_set_data (G_OBJECT(menu_item), "tree-view", payee_tree);
471     gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
472 
473     /* Separator */
474     gtk_menu_shell_append (GTK_MENU_SHELL (menu), gtk_separator_menu_item_new());
475 
476     /* menu pour afficher les tiers inutilisés */
477     if ((nb_unused = gsb_data_payee_get_unused_payees ()) == 0)
478     {
479         menu_item = gtk_check_menu_item_new_with_label (_("Display unused payees"));
480         gtk_widget_set_sensitive (menu_item, FALSE);
481     }
482     else
483     {
484         gchar *tmp_str;
485         gchar *tmp_str_1;
486 
487         tmp_str = g_strdup_printf (" (%d)", nb_unused);
488         tmp_str_1 = g_strconcat (_("Display unused payees"), tmp_str, NULL);
489         menu_item = gtk_check_menu_item_new_with_label (tmp_str_1);
490         g_free (tmp_str);
491         g_free (tmp_str_1);
492     }
493     gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item), display_unused_payees);
494     gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item);
495     g_signal_connect (G_OBJECT (menu_item),
496                       "activate",
497                       G_CALLBACK (payee_menu_display_unused_payees_activate),
498                       NULL);
499 
500     gtk_widget_show_all (menu);
501 
502 #if GTK_CHECK_VERSION (3,22,0)
503 	gtk_menu_popup_at_pointer (GTK_MENU (menu), NULL);
504 #else
505     gtk_menu_popup (GTK_MENU(menu), NULL, button, set_popup_position, button, 1,
506 					gtk_get_current_event_time());
507 #endif
508     return FALSE;
509 }
510 
511 /**
512  * Create a button bar allowing to act on the payee list.  Some of
513  * these buttons are "linked" to the selection status of the payee
514  * metatree.  That is, if nothing is selected, they will become
515  * unsensitive.
516  *
517  * \param
518  *
519  * \return	A newly-allocated widget.
520  **/
creation_barre_outils_tiers(void)521 static GtkWidget *creation_barre_outils_tiers (void)
522 {
523     GtkWidget *toolbar;
524     GtkToolItem *item;
525 
526     toolbar = gtk_toolbar_new ();
527 
528     /* New payee button */
529     item = utils_buttons_tool_button_new_from_image_label ("gsb-new-payee-24.png", _("New payee"));
530     gtk_widget_set_tooltip_text (GTK_WIDGET (item), _("Create a new payee"));
531     g_signal_connect_swapped (G_OBJECT (item),
532 							  "clicked",
533 							  G_CALLBACK (appui_sur_ajout_payee),
534 							  payee_tree_model);
535     gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
536 
537     /* delete button */
538     item = utils_buttons_tool_button_new_from_image_label ("gtk-delete-24.png", _("Delete"));
539     metatree_register_widget_as_linked (GTK_TREE_MODEL (payee_tree_model),
540 										GTK_WIDGET (item),
541 										"selection");
542     gtk_widget_set_tooltip_text (GTK_WIDGET (item), _("Delete selected payee"));
543     g_signal_connect_swapped (G_OBJECT (item),
544 							  "clicked",
545 							  G_CALLBACK (supprimer_division),
546 							  payee_tree);
547     gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
548 
549     /* edit button */
550     item = utils_buttons_tool_button_new_from_image_label ("gtk-edit-24.png", _("Edit"));
551     metatree_register_widget_as_linked (GTK_TREE_MODEL (payee_tree_model),
552 										GTK_WIDGET (item),
553 										"selection");
554     gtk_widget_set_tooltip_text (GTK_WIDGET (item), _("Edit selected payee"));
555     g_signal_connect_swapped (G_OBJECT (item),
556 							  "clicked",
557 							  G_CALLBACK (edit_payee),
558 							  payee_tree);
559     gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
560 
561     /* Change view mode button */
562     item = utils_buttons_tool_button_new_from_image_label ("gtk-select-color-24.png", _("View"));
563     gtk_widget_set_tooltip_text (GTK_WIDGET (item), _("Change view mode"));
564     g_signal_connect (G_OBJECT (item),
565 					  "clicked",
566 					  G_CALLBACK (popup_payee_view_mode_menu),
567                       NULL);
568     gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
569 
570     /* Manage payees button */
571     item = utils_buttons_tool_button_new_from_image_label ("gsb-payees-manage-24.png", _("Manage payees"));
572     gtk_widget_set_tooltip_text (GTK_WIDGET (item), _("Manage the payees"));
573     g_signal_connect (G_OBJECT (item),
574 					  "clicked",
575                       G_CALLBACK (payees_manage_payees),
576                       NULL);
577     gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
578 
579     /* Remove unused payees button */
580     item = utils_buttons_tool_button_new_from_image_label ("gtk-delete-24.png", _("Remove unused payees"));
581     gtk_widget_set_tooltip_text (GTK_WIDGET (item), _("Remove orphan payees"));
582     g_signal_connect (G_OBJECT (item),
583                       "clicked",
584                       G_CALLBACK (payees_remove_unused_payees),
585                       NULL);
586     gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
587 
588     metatree_set_linked_widgets_sensitive (GTK_TREE_MODEL (payee_tree_model), FALSE, "selection");
589 
590     return (toolbar);
591 }
592 
593 /******************************************************************************/
594 /* Public functions                                                           */
595 /******************************************************************************/
596 /**
597  * update the form's combofix for the payees
598  *
599  * \param
600  *
601  * \return FALSE
602  **/
payees_update_combofix(gboolean force)603 gboolean payees_update_combofix (gboolean force)
604 {
605     if (gsb_data_form_check_for_value (TRANSACTION_FORM_PARTY) || force)
606 	{
607     	GtkWidget *widget;
608 		GSList *tmp_list;
609 
610 		widget = gsb_form_widget_get_widget (TRANSACTION_FORM_PARTY);
611 		tmp_list = gsb_data_payee_get_name_and_report_list ();
612 		gtk_combofix_set_list (GTK_COMBOFIX (widget), tmp_list);
613 		gsb_data_payee_free_name_and_report_list (tmp_list);
614 	}
615 
616     return FALSE;
617 }
618 
619 /**
620  * réinitialisation des variables globales
621  *
622  * \param
623  *
624  * \return
625  **/
payees_init_variables_list(void)626 void payees_init_variables_list (void)
627 {
628 	GrisbiWinEtat *w_etat;
629 
630 	w_etat = (GrisbiWinEtat *) grisbi_win_get_w_etat ();
631     payee_tree_model = NULL;
632     payee_toolbar = NULL;
633     payee_tree = NULL;
634     w_etat->no_devise_totaux_tiers = 1;
635     display_unused_payees = FALSE;
636     sortie_edit_payee = FALSE;
637 }
638 
639 
640 /**
641  * Crée la liste des Tiers
642  *
643  * \param
644  *
645  * \return	A newly-allocated widget.
646 **/
payees_create_list(void)647 GtkWidget *payees_create_list (void)
648 {
649 	GtkWidget *window;
650     GtkWidget *onglet, *scroll_window;
651     GtkWidget *frame;
652     GtkTreeViewColumn *column;
653     GtkCellRenderer *cell;
654     GtkTreeDragDestIface * dst_iface;
655     GtkTreeDragSourceIface * src_iface;
656     static GtkTargetEntry row_targets[] = {{(gchar*)"GTK_TREE_MODEL_ROW", GTK_TARGET_SAME_WIDGET, 0}};
657 
658 	window = GTK_WIDGET (grisbi_app_get_active_window (NULL));
659 
660 	/* création de la fenêtre qui sera renvoyée */
661     onglet = gtk_box_new (GTK_ORIENTATION_VERTICAL, MARGIN_BOX);
662     gtk_widget_show (onglet);
663 
664     /* frame pour la barre d'outils */
665     frame = gtk_frame_new (NULL);
666     gtk_box_pack_start (GTK_BOX (onglet), frame, FALSE, FALSE, 0);
667 
668     /* We create the gtktreeview and model early so that they can be referenced. */
669     payee_tree = gtk_tree_view_new();
670 
671     /* set the color of selected row */
672 	gtk_widget_set_name (payee_tree, "colorized_tree_view");
673 
674     payee_tree_model = gtk_tree_store_new (META_TREE_NUM_COLUMNS, META_TREE_COLUMN_TYPES);
675 
676     /* on y ajoute la barre d'outils */
677     payee_toolbar = creation_barre_outils_tiers ();
678     gtk_container_add (GTK_CONTAINER (frame), payee_toolbar);
679 
680     /* création de l'arbre principal */
681     scroll_window = gtk_scrolled_window_new (NULL, NULL);
682     gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll_window),
683 									GTK_POLICY_AUTOMATIC,
684 									GTK_POLICY_AUTOMATIC);
685     gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(scroll_window), GTK_SHADOW_IN);
686     gtk_box_pack_start (GTK_BOX (onglet), scroll_window, TRUE, TRUE, 0);
687     gtk_widget_show (scroll_window);
688 
689     /* Create model */
690     gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE(payee_tree_model),
691 										  META_TREE_TEXT_COLUMN,
692 										  GTK_SORT_ASCENDING);
693     gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (payee_tree_model),
694 									 META_TREE_TEXT_COLUMN,
695 									 metatree_sort_column,
696 									 NULL,
697 									 NULL);
698     g_object_set_data (G_OBJECT (payee_tree_model), "metatree-interface", payee_get_metatree_interface ());
699 
700     /* Create container + TreeView */
701     gtk_tree_view_enable_model_drag_source(GTK_TREE_VIEW(payee_tree),
702 										   GDK_BUTTON1_MASK,
703 										   row_targets,
704 										   1,
705 										   GDK_ACTION_MOVE | GDK_ACTION_COPY);
706     gtk_tree_view_enable_model_drag_dest (GTK_TREE_VIEW(payee_tree),
707 										  row_targets,
708 										  1,
709 										  GDK_ACTION_MOVE | GDK_ACTION_COPY);
710     gtk_tree_view_set_reorderable (GTK_TREE_VIEW(payee_tree), TRUE);
711     gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW(payee_tree)), GTK_SELECTION_SINGLE);
712     gtk_tree_view_set_model (GTK_TREE_VIEW (payee_tree), GTK_TREE_MODEL (payee_tree_model));
713     g_object_unref (G_OBJECT(payee_tree_model));
714     g_object_set_data (G_OBJECT(payee_tree_model), "tree-view", payee_tree);
715 
716     /* Make category column */
717     cell = gtk_cell_renderer_text_new ();
718     column = gtk_tree_view_column_new_with_attributes (_("Payees"),
719 													   cell,
720 													   "text", META_TREE_TEXT_COLUMN,
721 													   "weight", META_TREE_FONT_COLUMN,
722 													   "cell-background-rgba", META_TREE_BACKGROUND_COLOR,
723 													   NULL);
724     gtk_tree_view_append_column (GTK_TREE_VIEW (payee_tree), GTK_TREE_VIEW_COLUMN (column));
725 
726     /* Make account column */
727     cell = gtk_cell_renderer_text_new ();
728     column = gtk_tree_view_column_new_with_attributes (_("Account"),
729 													   cell,
730 													   "text", META_TREE_ACCOUNT_COLUMN,
731 													   "weight", META_TREE_FONT_COLUMN,
732 													   "cell-background-rgba", META_TREE_BACKGROUND_COLOR,
733 													   NULL);
734     gtk_tree_view_append_column (GTK_TREE_VIEW (payee_tree), GTK_TREE_VIEW_COLUMN (column));
735 
736     /* Make amount column */
737     cell = gtk_cell_renderer_text_new ();
738 	gtk_cell_renderer_set_padding (GTK_CELL_RENDERER (cell), MARGIN_BOX, 0);
739 	column = gtk_tree_view_column_new_with_attributes (_("Amount"), cell,
740 						       "text", META_TREE_BALANCE_COLUMN,
741 						       "weight", META_TREE_FONT_COLUMN,
742 						       "xalign", META_TREE_XALIGN_COLUMN,
743                                "cell-background-rgba", META_TREE_BACKGROUND_COLOR,
744 						       NULL);
745     gtk_tree_view_append_column (GTK_TREE_VIEW (payee_tree), GTK_TREE_VIEW_COLUMN (column));
746     gtk_tree_view_column_set_alignment (column, COLUMN_RIGHT);
747     gtk_container_add (GTK_CONTAINER (scroll_window), payee_tree);
748     gtk_widget_show (payee_tree);
749 
750     /* Connect to signals */
751     g_signal_connect (G_OBJECT (payee_tree),
752                       "row-collapsed",
753                       G_CALLBACK (division_column_collapsed),
754                       NULL);
755 
756     g_signal_connect (G_OBJECT (payee_tree),
757                       "row-expanded",
758                       G_CALLBACK (division_column_expanded),
759                       NULL);
760 
761     g_signal_connect (G_OBJECT (payee_tree),
762                       "row-activated",
763                       G_CALLBACK (division_activated),
764                       NULL);
765 
766     g_signal_connect (G_OBJECT (payee_tree),
767                       "button-press-event",
768                       G_CALLBACK (payee_list_button_press),
769                       NULL);
770 
771     dst_iface = GTK_TREE_DRAG_DEST_GET_IFACE (payee_tree_model);
772     if (dst_iface)
773     {
774 		dst_iface->drag_data_received = &division_drag_data_received;
775 		dst_iface->row_drop_possible = &division_row_drop_possible;
776     }
777 
778     src_iface = GTK_TREE_DRAG_SOURCE_GET_IFACE (payee_tree_model);
779     if (src_iface)
780     {
781 		gtk_selection_add_target (window,
782 								  GDK_SELECTION_PRIMARY,
783 								  GDK_SELECTION_TYPE_ATOM,
784 								  1);
785 		src_iface->drag_data_get = &payee_drag_data_get;
786     }
787 
788     g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (payee_tree)),
789                       "changed",
790                       G_CALLBACK (metatree_selection_changed),
791                       payee_tree_model);
792 
793     /* création de la structure de sauvegarde de la position */
794     payee_hold_position = g_malloc0 (sizeof (struct MetatreeHoldPosition));
795 
796     gtk_widget_show_all (frame);
797 
798     return (onglet);
799 }
800 
801 /**
802  *
803  *
804  * \param
805  *
806  * \return
807  **/
gsb_gui_payees_toolbar_set_style(gint toolbar_style)808 void gsb_gui_payees_toolbar_set_style (gint toolbar_style)
809 {
810     gtk_toolbar_set_style (GTK_TOOLBAR (payee_toolbar), toolbar_style);
811 }
812 
813 /**
814  * called by button delete unused payees
815  * show a message to be sure and remove all the payees without transactions
816  *
817  * \param
818  *
819  * \return FALSE
820  **/
payees_remove_unused_payees(void)821 void payees_remove_unused_payees (void)
822 {
823     gint result;
824 
825     result = dialogue_yes_no (_("This will remove all the payees which are not used in any transactions.  "
826                                  "Payees linked to an archived transactions will not be removed, even if not "
827                                  "used outside the archive.\n\nAre you sure you want to do that?"),
828                                _("Remove orphan payees"),
829                                GTK_RESPONSE_CANCEL);
830 
831     if (result == TRUE)
832     {
833         gint nb_removed;
834         gchar *tmpstr;
835 
836         nb_removed = gsb_data_payee_remove_unused ();
837         if (nb_removed > 0)
838         {
839             payees_fill_list ();
840             tmpstr = g_strdup_printf (_("Removed %d payees."), nb_removed);
841             gsb_file_set_modified (TRUE);
842 			payees_update_combofix (TRUE);
843         }
844         else
845         {
846             tmpstr = g_strdup (_("There is no payee to remove."));
847         }
848         dialogue (tmpstr);
849         g_free (tmpstr);
850     }
851 }
852 
853 /**
854  * fill the payee tree
855  *
856  * \param
857  *
858  * \return
859  **/
payees_fill_list(void)860 void payees_fill_list (void)
861 {
862     void *empty_payee;
863     gint payee_number;
864     GSList *payee_list_tmp;
865     GtkTreeIter iter_payee;
866     GtkTreeSelection *selection;
867 
868     devel_debug (NULL);
869 
870     grisbi_win_status_bar_wait (FALSE);
871 
872     /* on bloque la fonction pendant la mise à jour du model */
873     selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (payee_tree));
874     g_signal_handlers_block_by_func (G_OBJECT (selection),
875                         G_CALLBACK (metatree_selection_changed),
876                         payee_tree_model);
877 
878     /* Dettach the model so that insertion will be much faster */
879     g_object_ref (G_OBJECT(payee_tree_model));
880     gtk_tree_view_set_model (GTK_TREE_VIEW (payee_tree), NULL);
881 
882     /** First, remove previous tree */
883 	if (!payee_tree_model || !GTK_IS_TREE_STORE (payee_tree_model))
884 		return;
885 	else
886    		gtk_tree_store_clear (GTK_TREE_STORE (payee_tree_model));
887 
888     /* Compute payee balances. */
889     gsb_data_payee_update_counters ();
890 
891     /* add the virtually unused payee to the top of the list */
892     empty_payee = gsb_data_payee_get_empty_payee ();
893     payee_number = gsb_data_payee_get_no_payee (empty_payee);
894     gtk_tree_store_append (GTK_TREE_STORE (payee_tree_model), &iter_payee, NULL);
895     fill_division_row (GTK_TREE_MODEL(payee_tree_model),
896                 payee_get_metatree_interface (),
897                 &iter_payee, payee_number);
898 
899     /** Then, populate tree with payee. */
900     payee_list_tmp = g_slist_copy (gsb_data_payee_get_payees_list ());
901 
902     payee_list_tmp = g_slist_sort (payee_list_tmp, (GCompareFunc) gsb_data_payee_compare_payees_by_name);
903 
904     while (payee_list_tmp)
905     {
906         payee_number = gsb_data_payee_get_no_payee (payee_list_tmp->data);
907 
908         if (display_unused_payees || gsb_data_payee_get_nb_transactions (payee_number))
909         {
910             gtk_tree_store_append (GTK_TREE_STORE (payee_tree_model), &iter_payee, NULL);
911             fill_division_row (GTK_TREE_MODEL (payee_tree_model),
912                         payee_get_metatree_interface (),
913                         &iter_payee,
914                         payee_number);
915         }
916         payee_list_tmp = payee_list_tmp->next;
917     }
918 
919     g_slist_free (payee_list_tmp);
920 
921     /* Reattach the model */
922     gtk_tree_view_set_model (GTK_TREE_VIEW (payee_tree),
923 			     GTK_TREE_MODEL (payee_tree_model));
924 
925     /* on débloque la fonction de callback */
926     g_signal_handlers_unblock_by_func (G_OBJECT (selection),
927                         G_CALLBACK (metatree_selection_changed),
928                         payee_tree_model);
929 
930     /* replace le curseur sur la division, sub_division ou opération initiale */
931     if (payee_hold_position->path)
932     {
933         if (payee_hold_position->expand)
934         {
935             GtkTreePath *ancestor;
936 
937             ancestor = gtk_tree_path_copy (payee_hold_position->path);
938             gtk_tree_path_up (ancestor);
939             gtk_tree_view_expand_to_path (GTK_TREE_VIEW (payee_tree), ancestor);
940             gtk_tree_path_free (ancestor);
941         }
942 
943         /* on colorise les lignes du tree_view */
944         utils_set_tree_store_background_color (payee_tree, META_TREE_BACKGROUND_COLOR);
945         gtk_tree_selection_select_path (selection, payee_hold_position->path);
946         gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (payee_tree),
947                         payee_hold_position->path,
948                         NULL, TRUE, 0.5, 0.5);
949     }
950     else
951     {
952         gchar *title;
953 
954         /* on colorise les lignes du tree_view */
955         utils_set_tree_store_background_color (payee_tree, META_TREE_BACKGROUND_COLOR);
956         /* on fixe le titre et le suffixe de la barre d'information */
957 	    title = g_strdup(_("Payees"));
958         grisbi_win_headings_update_title (title);
959         g_free (title);
960         grisbi_win_headings_update_suffix ("");
961     }
962 
963     g_object_unref (G_OBJECT (payee_tree_model));
964 
965     grisbi_win_status_bar_stop_wait (FALSE);
966 }
967 
968 /**
969  * fonction pour sauvegarder le chemin du dernier tiers sélectionné.
970  *
971  * \param path
972  *
973  * \return
974  **/
payees_hold_position_set_path(GtkTreePath * path)975 gboolean payees_hold_position_set_path (GtkTreePath *path)
976 {
977     payee_hold_position->path = gtk_tree_path_copy (path);
978 
979     return TRUE;
980 }
981 
982 /**
983  * sauvegarde l'attribut expand.
984  *
985  * \param expand
986  *
987  * \return
988  **/
payees_hold_position_set_expand(gboolean expand)989 gboolean payees_hold_position_set_expand (gboolean expand)
990 {
991     payee_hold_position->expand = expand;
992 
993     return TRUE;
994 }
995 
996 /**
997  *
998  *
999  * \param
1000  *
1001  * \return
1002  **/
payees_get_tree_store(void)1003 GtkTreeStore *payees_get_tree_store (void)
1004 {
1005     return payee_tree_model;
1006 }
1007 
1008 /**
1009  *
1010  *
1011  * \param
1012  *
1013  * \return
1014  **/
payees_get_tree_view(void)1015 GtkWidget *payees_get_tree_view (void)
1016 {
1017     return payee_tree;
1018 }
1019 
1020 /**
1021  *
1022  *
1023  * \param
1024  *
1025  * \return
1026  **/
payees_new_payee(void)1027 void payees_new_payee (void)
1028 {
1029     metatree_new_division (GTK_TREE_MODEL (payee_tree_model));
1030 
1031     sortie_edit_payee = FALSE;
1032     edit_payee (GTK_TREE_VIEW (payee_tree));
1033     if (sortie_edit_payee)
1034     {
1035         supprimer_division (GTK_TREE_VIEW (payee_tree));
1036         sortie_edit_payee = FALSE;
1037     }
1038 }
1039 
1040 /**
1041  *
1042  *
1043  * \param
1044  *
1045  * \return
1046  **/
payees_delete_payee(void)1047 void payees_delete_payee (void)
1048 {
1049     supprimer_division (GTK_TREE_VIEW (payee_tree));
1050 }
1051 
1052 /**
1053  *
1054  *
1055  * \param
1056  *
1057  * \return
1058  **/
payees_edit_payee(void)1059 void payees_edit_payee (void)
1060 {
1061     edit_payee (GTK_TREE_VIEW (payee_tree));
1062 }
1063 
1064 /* ******************************************************************************/
1065 /* assistant de gestion des tiers :                                             */
1066 /* permet de modifier en masse le nom d'un tiers contenant une chaine           */
1067 /* par une autre chaine                                                         */
1068 /* **************************************************************************** */
1069 /******************************************************************************/
1070 /* Private functions                                                          */
1071 /******************************************************************************/
1072 /**
1073  * Valide les modèles possibles pour la recherche (toto% %toto %toto% toto%tata)
1074  *
1075  * \param needle chaine de recherche
1076  *
1077  * \return 1 si correct 0 si vide -1 si non conforme au modèle
1078  **/
gsb_assistant_payees_valide_model_recherche(const gchar * needle)1079 static gint gsb_assistant_payees_valide_model_recherche (const gchar *needle)
1080 {
1081     gchar **tab_str;
1082     gboolean is_prefix = FALSE, is_suffix = FALSE;
1083 
1084 //~ printf ("needle = %s\n", needle);
1085     if (needle && strlen (needle))
1086     {
1087         if (g_str_has_prefix (needle, "%")|| g_str_has_prefix (needle, "*"))
1088             is_prefix = TRUE;
1089 
1090         if (g_str_has_suffix (needle, "%") || g_str_has_suffix (needle, "*"))
1091             is_suffix = TRUE;
1092 
1093 //~ printf ("is_prefix = %d is_suffix = %d\n", is_prefix, is_suffix);
1094         if (is_prefix && is_suffix)
1095         {
1096             tab_str = g_strsplit_set (needle, "%*", 0);
1097             if (g_strv_length (tab_str) >= 3)	/* si > 3->%chaine1%chaine2...%chainen% */
1098                 return 1;							/* si = 3->%chaine% */
1099             else
1100                 return -1;
1101         }
1102         else if (is_prefix && !is_suffix)
1103             return 1;
1104         else if (is_suffix && !is_prefix)
1105             return 1;
1106         else if (!is_prefix && !is_suffix)
1107         {
1108             tab_str = g_strsplit_set (needle, "%*", 0);
1109             if (g_strv_length (tab_str) >= 2)	/* si > 2->chaine1%chaine2...%chainen */
1110                 return 1;							/* si = 2->chaine1%chaine2 */
1111             else if (gsb_data_payee_get_number_by_name (needle, FALSE))
1112                 return 1;
1113             else
1114                 return -1;
1115         }
1116         else
1117             return -1;
1118     }
1119     else
1120         return 0;
1121 }
1122 
1123 /**
1124  *
1125  *
1126  * \param
1127  * \param
1128  *
1129  * \return
1130  **/
gsb_assistant_payees_entry_changed(GtkEditable * editable,GtkWidget * assistant)1131 static void gsb_assistant_payees_entry_changed (GtkEditable *editable,
1132 												GtkWidget *assistant)
1133 {
1134 	GtkWidget *combo;
1135     GtkWidget *entry;
1136     const gchar *str_cherche;
1137 
1138     combo = g_object_get_data (G_OBJECT (assistant), "payee");
1139     str_cherche = gtk_combofix_get_text (GTK_COMBOFIX (combo));
1140     switch (gsb_assistant_payees_valide_model_recherche (str_cherche))
1141 	{
1142         case 0:
1143 			dialogue_warning (_("You must choose a payee for searching."));
1144 			break;
1145         case -1:
1146 			dialogue_warning (
1147 							_("Beware you don't use one of models for the research."));
1148 			break;
1149         case 1:
1150 			gsb_assistant_sensitive_button_next (assistant,TRUE);
1151 			return;
1152 			break;
1153     }
1154     g_signal_handlers_block_by_func (G_OBJECT (editable),
1155 									 G_CALLBACK (gsb_assistant_payees_entry_changed),
1156 									 assistant);
1157     gtk_editable_delete_text (editable, 0, -1);
1158 	entry = gtk_combofix_get_entry (GTK_COMBOFIX (combo));
1159     gtk_widget_grab_focus (entry);
1160     g_signal_handlers_unblock_by_func (G_OBJECT (editable),
1161 									   G_CALLBACK (gsb_assistant_payees_entry_changed),
1162 									   assistant);
1163 }
1164 
1165 /**
1166  *
1167  *
1168  * \param
1169  *
1170  * \return
1171  **/
gsb_assistant_payees_page_2(GtkWidget * assistant)1172 static GtkWidget *gsb_assistant_payees_page_2 (GtkWidget *assistant)
1173 {
1174     GtkWidget *page;
1175 	GtkWidget *combo;
1176     GtkWidget *entry;
1177 	GtkWidget *hbox;
1178     GtkWidget *label;
1179     GtkWidget *paddingbox;
1180     GtkWidget *check_option;
1181 	GSList *tmp_list;
1182     gchar *texte;
1183 	gchar *data;
1184 	gboolean metatree_unarchived_payees = FALSE;
1185 	GrisbiWinEtat *w_etat;
1186 	GrisbiWinRun *w_run;
1187 
1188     devel_debug ("PAGE 2");
1189 	w_run = grisbi_win_get_w_run ();
1190 	w_etat = grisbi_win_get_w_etat ();
1191 
1192     page = gtk_box_new (GTK_ORIENTATION_VERTICAL, MARGIN_BOX);
1193     gtk_container_set_border_width (GTK_CONTAINER (page), BOX_BORDER_WIDTH);
1194 
1195 	/* get rule */
1196     paddingbox = new_paddingbox_with_title (page, TRUE, _("Choose a payee"));
1197 
1198     texte = g_strdup (_("Select one payee in the list that you modify to "
1199 						"serve as the basis for your research.\n"
1200 						"You can use % as wildcard. Templates availables:\n"
1201 						"%string, string%, %string%, %string_1%string_2%\n\n"
1202 						"You can concatenate several rules: rule1||rule2..."));
1203 	label = gtk_label_new (texte);
1204 	utils_labels_set_alignment (GTK_LABEL (label), 0, 0);
1205 	gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1206 	g_free (texte);
1207 	gtk_box_pack_start (GTK_BOX (paddingbox), label, FALSE, FALSE, MARGIN_BOX);
1208 
1209 	/* On sauvegarde w_etat->metatree_unarchived_payees le temps de prendre la liste totale des tiers */
1210 	if (w_etat->metatree_unarchived_payees)
1211 	{
1212 		w_etat->metatree_unarchived_payees = FALSE;
1213 		metatree_unarchived_payees = TRUE;
1214 	}
1215 	tmp_list = gsb_data_payee_get_name_and_report_list();
1216 	combo = gtk_combofix_new_with_properties (tmp_list,
1217 											  FALSE,
1218 											  !w_run->import_asso_case_insensitive,
1219 											  FALSE,
1220 											  METATREE_PAYEE);
1221     gtk_box_pack_start (GTK_BOX (paddingbox), combo, FALSE, FALSE, MARGIN_BOX);
1222     g_object_set_data (G_OBJECT (assistant), "payee", combo);
1223 
1224 	data = g_object_get_data (G_OBJECT (assistant), "rule");
1225 	if (data)
1226 		gtk_combofix_set_text (GTK_COMBOFIX (combo), data);
1227 
1228 	/* get new payee */
1229 	paddingbox = new_paddingbox_with_title (page, TRUE, _("Enter the new payee"));
1230 	hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, MARGIN_BOX);
1231     gtk_box_pack_start (GTK_BOX (paddingbox), hbox, FALSE, FALSE, 0);
1232 
1233     texte = g_strdup (_("Enter the name of the new payee: "));
1234     label = gtk_label_new (texte);
1235 	utils_labels_set_alignment (GTK_LABEL (label), 0, 0);
1236 	gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1237     g_free (texte);
1238     gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, MARGIN_BOX);
1239 
1240     combo = gtk_combofix_new_with_properties (tmp_list,
1241 											  TRUE,
1242 											  etat.combofix_case_sensitive,
1243 											  FALSE,
1244 											  METATREE_PAYEE);
1245 	gsb_data_payee_free_name_and_report_list (tmp_list);
1246 	if (metatree_unarchived_payees)
1247 	{
1248 		w_etat->metatree_unarchived_payees = TRUE;
1249 	}
1250 
1251 	entry = gtk_combofix_get_entry (GTK_COMBOFIX (combo));
1252     g_signal_connect (entry,
1253                       "changed",
1254                       G_CALLBACK (gsb_assistant_payees_entry_changed),
1255                       assistant);
1256     gtk_box_pack_start (GTK_BOX(hbox), combo, TRUE, TRUE, MARGIN_BOX);
1257     g_object_set_data (G_OBJECT (assistant), "new_payee", combo);
1258 
1259 	/* set options */
1260     paddingbox = new_paddingbox_with_title (page, TRUE, _("Options"));
1261     check_option = gtk_check_button_new_with_label (_("Extracting a number and save it "
1262 													  "in the field No Cheque/Virement"));
1263 
1264     gtk_box_pack_start (GTK_BOX(paddingbox), check_option, FALSE, FALSE, 0);
1265     g_object_set_data (G_OBJECT (assistant), "check_option_1", check_option);
1266 
1267     check_option = gtk_check_button_new_with_label (_("Save the payees in the notes"));
1268     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_option), TRUE);
1269     gtk_box_pack_start (GTK_BOX(paddingbox), check_option, FALSE, FALSE, 0);
1270     g_object_set_data (G_OBJECT (assistant), "check_option_2", check_option);
1271 
1272 	check_option = gtk_check_button_new_with_label (_("Ignoring case sensitive"));
1273     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_option), w_run->import_asso_case_insensitive);
1274     gtk_box_pack_start (GTK_BOX (paddingbox), check_option, FALSE, FALSE, 0);
1275     g_object_set_data (G_OBJECT (assistant), "check_option_3", check_option);
1276 
1277     check_option = gtk_check_button_new_with_label (_("Use the regular expressions"));
1278     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_option), w_run->import_asso_use_regex);
1279     gtk_box_pack_start (GTK_BOX (paddingbox), check_option, FALSE, FALSE, 0);
1280     g_object_set_data (G_OBJECT (assistant), "check_option_4", check_option);
1281 	gtk_widget_set_sensitive (check_option, FALSE);
1282 
1283     gtk_widget_show_all (page);
1284 
1285 	return page;
1286 }
1287 
1288 /**
1289  *
1290  *
1291  * \param
1292  * \param
1293  * \param
1294  *
1295  * \return
1296  **/
gsb_assistant_payees_toggled(GtkCellRendererToggle * cell,gchar * path_str,GtkWidget * assistant)1297 static void gsb_assistant_payees_toggled (GtkCellRendererToggle *cell,
1298 										  gchar *path_str,
1299 										  GtkWidget *assistant)
1300 {
1301     GtkTreeView *treeview;
1302     GtkLabel *label;
1303     GtkTreeModel *model;
1304     GtkTreeIter  iter;
1305     GtkTreePath *path;
1306     GSList *sup_payees;
1307     gint payee_number;
1308     gboolean fixed;
1309 
1310     path = gtk_tree_path_new_from_string (path_str);
1311 
1312 	/* get model, iter and data */
1313     treeview = g_object_get_data (G_OBJECT (assistant), "treeview");
1314     model = gtk_tree_view_get_model (treeview);
1315     gtk_tree_model_get_iter (model, &iter, path);
1316     gtk_tree_model_get (model, &iter, COLUMN_BOOLEAN, &fixed, COLUMN_INT, &payee_number, -1);
1317 
1318     /* do something with the value */
1319     sup_payees = g_object_get_data (G_OBJECT (assistant), "sup_payees");
1320     if (g_slist_find (sup_payees, GINT_TO_POINTER (payee_number)) && fixed)
1321         sup_payees = g_slist_delete_link (sup_payees,
1322 										  g_slist_find (sup_payees, GINT_TO_POINTER (payee_number)));
1323     else
1324         sup_payees = g_slist_prepend (sup_payees, GINT_TO_POINTER (payee_number));
1325 
1326     g_object_set_data (G_OBJECT (assistant), "sup_payees", sup_payees);
1327     label = g_object_get_data (G_OBJECT (assistant), "nbre_tiers_select");
1328     gtk_label_set_text (label, g_strdup_printf ("%d", g_slist_length (sup_payees)));
1329     fixed ^= 1;
1330 
1331     /* set new value */
1332     gtk_list_store_set (GTK_LIST_STORE (model), &iter, COLUMN_BOOLEAN, fixed, -1);
1333 
1334     /* clean up */
1335     gtk_tree_path_free (path);
1336 
1337     /* gestion du bouton next */
1338     if (g_slist_length (sup_payees) == 0)
1339         gsb_assistant_sensitive_button_next (assistant, FALSE);
1340     else
1341         gsb_assistant_sensitive_button_next (assistant, TRUE);
1342 }
1343 
1344 /**
1345  *
1346  *
1347  * \param
1348  * \param
1349  * \param
1350  * \param
1351  *
1352  * \return
1353  **/
gsb_assistant_payees_select_func(GtkTreeModel * model,GtkTreePath * path,GtkTreeIter * iter,gpointer data)1354 static gboolean gsb_assistant_payees_select_func (GtkTreeModel *model,
1355 												  GtkTreePath *path,
1356 												  GtkTreeIter *iter,
1357 												  gpointer data)
1358 {
1359     gtk_list_store_set (GTK_LIST_STORE (model), iter, COLUMN_BOOLEAN,  GPOINTER_TO_INT (data), -1);
1360     return FALSE;
1361 }
1362 
1363 /**
1364  *
1365  *
1366  * \param
1367  * \param
1368  *
1369  * \return
1370  **/
gsb_assistant_payees_clicked(GtkButton * button,GtkWidget * assistant)1371 static void gsb_assistant_payees_clicked (GtkButton *button,
1372 										  GtkWidget *assistant)
1373 {
1374     GtkTreeView *treeview;
1375     GtkLabel *label;
1376     GtkTreeModel *model;
1377     GtkTreeIter iter;
1378     GSList *sup_payees;
1379     gchar *tmpstr;
1380     gboolean select, valid = FALSE;
1381 
1382     treeview = g_object_get_data (G_OBJECT (assistant), "treeview");
1383     sup_payees = g_object_get_data (G_OBJECT (assistant), "sup_payees");
1384     model = gtk_tree_view_get_model (GTK_TREE_VIEW (treeview));
1385     tmpstr = g_strdup (gtk_button_get_label (button));
1386 
1387     if (my_strcmp (tmpstr, _("Select all")) == 0)
1388     {
1389         gtk_button_set_label (button, _("Unselect all"));
1390         valid = gtk_tree_model_get_iter_first (model, &iter);
1391 
1392         while (valid)
1393         {
1394             gint payee_number;
1395 
1396             /* remplit la liste et coche les cases */
1397             gtk_tree_model_get (model, &iter, COLUMN_INT, &payee_number, -1);
1398             sup_payees = g_slist_append (sup_payees, GINT_TO_POINTER (payee_number));
1399             gtk_list_store_set (GTK_LIST_STORE (model), &iter, COLUMN_BOOLEAN,  TRUE , -1);
1400             valid = gtk_tree_model_iter_next (model, &iter);
1401         }
1402     }
1403     else
1404     {
1405         gtk_button_set_label (button, _("Select all"));
1406         /* décoche les cases */
1407         select = FALSE;
1408         gtk_tree_model_foreach (model, gsb_assistant_payees_select_func, GINT_TO_POINTER (select));
1409         g_slist_free (sup_payees);
1410         sup_payees = NULL;
1411     }
1412 
1413     g_object_set_data (G_OBJECT (assistant), "sup_payees", sup_payees);
1414     label = g_object_get_data (G_OBJECT (assistant), "nbre_tiers_select");
1415     gtk_label_set_text (label, g_strdup_printf ("%d", g_slist_length (sup_payees)));
1416 
1417     /* gestion du bouton next */
1418     if (g_slist_length (sup_payees) == 0)
1419         gsb_assistant_sensitive_button_next (assistant, FALSE);
1420     else
1421         gsb_assistant_sensitive_button_next (assistant, TRUE);
1422     g_free (tmpstr);
1423 }
1424 
1425 /**
1426  *
1427  *
1428  * \param
1429  *
1430  * \return
1431  **/
gsb_assistant_payees_page_3(GtkWidget * assistant)1432 static GtkWidget *gsb_assistant_payees_page_3 (GtkWidget *assistant)
1433 {
1434     GtkWidget *page;
1435 	GtkWidget *hbox;
1436 	GtkWidget *image;
1437     GtkWidget *label;
1438     GtkWidget *paddingbox;
1439     GtkWidget *sw;
1440     GtkWidget *treeview;
1441     GtkWidget *table;
1442     GtkWidget *button;
1443     GtkListStore *list_store;
1444     GtkTreeViewColumn *column;
1445     GtkCellRenderer *cell;
1446 	GrisbiWinRun *w_run;
1447 
1448     devel_debug ("PAGE 3");
1449 	w_run = grisbi_win_get_w_run ();
1450 
1451     page = gtk_box_new (GTK_ORIENTATION_VERTICAL, MARGIN_BOX);
1452     gtk_container_set_border_width (GTK_CONTAINER(page), BOX_BORDER_WIDTH);
1453 
1454     paddingbox = new_paddingbox_with_title (page, TRUE, _("List of payees who will be modified"));
1455 
1456     label = gtk_label_new ("");
1457 	utils_labels_set_alignment (GTK_LABEL (label), 0, 0);
1458 	gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1459     gtk_box_pack_start (GTK_BOX (paddingbox), label, FALSE, FALSE, MARGIN_BOX);
1460     g_object_set_data (G_OBJECT (assistant), "payee_search_label", label);
1461 
1462     label = gtk_label_new ("");
1463 	utils_labels_set_alignment (GTK_LABEL (label), 0, 0);
1464 	gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1465     gtk_box_pack_start (GTK_BOX (paddingbox), label, FALSE, FALSE, MARGIN_BOX);
1466     g_object_set_data (G_OBJECT (assistant), "new_payee_label", label);
1467 
1468 	/* set rule if necessary */
1469 	hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, MARGIN_BOX);
1470 	gtk_widget_set_no_show_all (hbox, TRUE);
1471     gtk_box_pack_start (GTK_BOX (paddingbox), hbox, FALSE, FALSE, 0);
1472 	g_object_set_data (G_OBJECT (assistant), "old_rule_hbox", hbox);
1473 
1474 	image = gtk_image_new_from_icon_name ("gtk-dialog-warning", GTK_ICON_SIZE_BUTTON);
1475     gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
1476 
1477     label = gtk_label_new ("");
1478 	utils_labels_set_alignment (GTK_LABEL (label), 0, 0);
1479 	gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1480     gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, MARGIN_BOX);
1481     g_object_set_data (G_OBJECT (assistant), "old_rule_label", label);
1482 
1483     button = gtk_check_button_new_with_label (_("Do you want replace the current rule?"));
1484     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), w_run->import_asso_replace_rule);
1485     gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, MARGIN_BOX);
1486     g_object_set_data (G_OBJECT (assistant), "check_option_5", button);
1487 
1488 	/* set scrolled window */
1489 	sw = gtk_scrolled_window_new (NULL, NULL);
1490     gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_ETCHED_IN);
1491     gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
1492 									GTK_POLICY_NEVER,
1493 									GTK_POLICY_ALWAYS);
1494 
1495 	gtk_widget_set_size_request (gtk_scrolled_window_get_vscrollbar (GTK_SCROLLED_WINDOW (sw)),
1496 								 -1,
1497 								 0);
1498     /* create the model */
1499     list_store = gtk_list_store_new (N_COLUMNS, G_TYPE_BOOLEAN, G_TYPE_UINT, G_TYPE_STRING);
1500 
1501     /* create the treeview */
1502     treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (list_store));
1503 	gtk_widget_set_name (treeview, "tree_view");
1504     g_object_unref (list_store);
1505 
1506     gtk_widget_set_size_request (treeview, -1, 300);
1507     gtk_container_add (GTK_CONTAINER (sw), treeview);
1508     gtk_box_pack_start (GTK_BOX (paddingbox), sw, TRUE, TRUE, MARGIN_BOX);
1509     g_object_set_data (G_OBJECT (assistant), "treeview", treeview);
1510 
1511     /* select payee */
1512     cell = gtk_cell_renderer_toggle_new ();
1513     g_signal_connect (cell,
1514                       "toggled",
1515                       G_CALLBACK (gsb_assistant_payees_toggled),
1516                       assistant);
1517     gtk_cell_renderer_toggle_set_radio (GTK_CELL_RENDERER_TOGGLE(cell), FALSE);
1518     g_object_set (cell, "xalign", 0.5, NULL);
1519 
1520     column = gtk_tree_view_column_new_with_attributes (_("Select"),
1521 													   cell,
1522 													   "active", COLUMN_BOOLEAN,
1523 													   NULL);
1524     gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), column);
1525 
1526     /* payee_number */
1527     cell = gtk_cell_renderer_text_new ();
1528     column = gtk_tree_view_column_new_with_attributes (_("Payee number"),
1529 													   cell,
1530 													   "text", COLUMN_INT,
1531 													   NULL);
1532     gtk_tree_view_column_set_sort_column_id (column, COLUMN_INT);
1533     gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
1534 
1535     /* payee name */
1536     cell = gtk_cell_renderer_text_new ();
1537     column = gtk_tree_view_column_new_with_attributes (_("Payee name"),
1538 													   cell,
1539 													   "text", COLUMN_STRING,
1540 													   NULL);
1541     gtk_tree_view_column_set_expand (column, TRUE);
1542     gtk_tree_view_column_set_sort_column_id (column, COLUMN_STRING);
1543     gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
1544 
1545     /* ajoute le nombre de tiers total */
1546     table = gtk_grid_new ();
1547     gtk_grid_set_column_spacing (GTK_GRID (table), MARGIN_BOX);
1548     gtk_grid_set_row_spacing (GTK_GRID (table), MARGIN_BOX);
1549 
1550     gtk_box_pack_start (GTK_BOX (page), table, FALSE, FALSE, 0);
1551 
1552     label = gtk_label_new (_("Total number of payees: "));
1553     utils_labels_set_alignment (GTK_LABEL (label), 0, 0.5);
1554     gtk_grid_attach (GTK_GRID (table), label, 0, 0, 1, 1);
1555     label = gtk_label_new ("   0");
1556     utils_labels_set_alignment (GTK_LABEL (label), 0, 0.5);
1557     gtk_grid_attach (GTK_GRID (table), label, 1, 0, 1, 1);
1558     g_object_set_data (G_OBJECT (assistant), "nbre_tiers_total", label);
1559 
1560     /* ajoute le nombre de tiers sélectionnés */
1561     label = gtk_label_new (_("Number of selected payees: "));
1562     utils_labels_set_alignment (GTK_LABEL (label), 0, 0.5);
1563     gtk_grid_attach (GTK_GRID (table), label, 2, 0, 1, 1);
1564     label = gtk_label_new ("   0");
1565     utils_labels_set_alignment (GTK_LABEL (label), 0, 0.5);
1566     gtk_grid_attach (GTK_GRID (table), label, 3, 0, 1, 1);
1567     g_object_set_data (G_OBJECT (assistant), "nbre_tiers_select", label);
1568 
1569     /* ajoute le bouton (dé)sélectionne tout */
1570     button = gtk_button_new_with_label (_("Unselect all"));
1571     g_signal_connect (button,
1572                         "clicked",
1573                         G_CALLBACK (gsb_assistant_payees_clicked),
1574                         assistant);
1575     gtk_grid_attach (GTK_GRID (table), button, 4, 0, 1, 1);
1576     g_object_set_data (G_OBJECT (assistant), "button", button);
1577 
1578     gtk_widget_show_all (page);
1579     return page;
1580 }
1581 
1582 /**
1583  *
1584  *
1585  * \param
1586  *
1587  * \return
1588  **/
gsb_assistant_payees_page_finish(GtkWidget * assistant)1589 static GtkWidget *gsb_assistant_payees_page_finish (GtkWidget *assistant)
1590 {
1591     GtkWidget *page;
1592     GtkWidget *label;
1593 
1594     devel_debug ("PAGE FINISH");
1595 
1596     page = gtk_box_new (GTK_ORIENTATION_VERTICAL, MARGIN_BOX);
1597     gtk_container_set_border_width (GTK_CONTAINER(page), BOX_BORDER_WIDTH);
1598 
1599     label = gtk_label_new (NULL);
1600     utils_labels_set_alignment (GTK_LABEL (label), 0.0, 0.0);
1601     gtk_box_pack_start (GTK_BOX (page), label, FALSE, FALSE, 0);
1602     g_object_set_data (G_OBJECT (assistant), "finish_label", label);
1603 
1604     gtk_widget_show_all (page);
1605     return page;
1606 }
1607 
1608 /**
1609  *
1610  *
1611  * \param
1612  *
1613  * \return
1614  **/
gsb_assistant_payees_enter_page_2(GtkWidget * assistant)1615 static gboolean gsb_assistant_payees_enter_page_2 (GtkWidget *assistant)
1616 {
1617     GtkWidget *combo;
1618 
1619     devel_debug ("Enter page 2");
1620 
1621     combo = g_object_get_data (G_OBJECT (assistant), "new_payee");
1622     gtk_combofix_set_text (GTK_COMBOFIX (combo), "");
1623 
1624     gsb_assistant_change_button_next (assistant, "gtk-go-forward", GTK_RESPONSE_YES);
1625     gsb_assistant_sensitive_button_next (assistant,FALSE);
1626 
1627     return FALSE;
1628 }
1629 
1630 /**
1631  *
1632  *
1633  * \param
1634  *
1635  * \return
1636  **/
gsb_assistant_payees_enter_page_3(GtkWidget * assistant)1637 static gboolean gsb_assistant_payees_enter_page_3 (GtkWidget *assistant)
1638 {
1639     GtkWidget *payee_search_label;
1640     GtkWidget *new_payee_label;
1641     GtkTreeView *treeview;
1642     GtkWidget *label;
1643     GtkListStore *list_store;
1644     GtkTreeIter iter;
1645     GSList *payee_list_tmp;
1646     GSList *sup_payees = NULL;
1647     gchar *str;
1648     const gchar *str_cherche;
1649     const gchar *new_tiers;
1650     gint i = 0;
1651 	gint ignore_case = 0;
1652 	gint payee_number;
1653 	gint use_regex = 0;
1654 
1655     devel_debug ("Enter page 3");
1656 
1657     str_cherche = gtk_combofix_get_text (GTK_COMBOFIX (g_object_get_data (G_OBJECT (assistant), "payee")));
1658 
1659     str = g_strdup_printf (_("Payee sought: %s"), str_cherche);
1660     payee_search_label = g_object_get_data (G_OBJECT (assistant), "payee_search_label");
1661     gtk_label_set_text (GTK_LABEL (payee_search_label), str);
1662     g_free (str);
1663 
1664     new_tiers = gtk_combofix_get_text (GTK_COMBOFIX (g_object_get_data (G_OBJECT (assistant), "new_payee")));
1665     str = g_strdup_printf (_("New payee: %s"), new_tiers);
1666     new_payee_label = g_object_get_data (G_OBJECT (assistant), "new_payee_label");
1667     gtk_label_set_text (GTK_LABEL (new_payee_label), str);
1668     g_free (str);
1669 
1670 	/* test if rule */
1671 	payee_number = gsb_data_payee_get_number_by_name (new_tiers, FALSE);
1672 	if (payee_number)
1673 	{
1674 		const gchar *old_search;
1675 
1676 		old_search = gsb_data_payee_get_search_string (payee_number);
1677 		if (old_search && strlen (old_search))
1678 		{
1679 	    	GtkWidget *check_option;
1680 			GtkWidget *hbox;
1681 
1682 			check_option = g_object_get_data (G_OBJECT (assistant), "check_option_5");
1683 			gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_option), TRUE);
1684 			hbox = g_object_get_data (G_OBJECT (assistant), "old_rule_hbox");
1685 			gtk_widget_set_no_show_all (hbox, FALSE);
1686 			label = g_object_get_data (G_OBJECT (assistant), "old_rule_label");
1687 			str = g_strdup_printf (_("Current rule: %s"), gsb_data_payee_get_search_string (payee_number));
1688 			gtk_label_set_text (GTK_LABEL (label), str);
1689 			gtk_widget_show_all (hbox);
1690     		g_free (str);
1691 		}
1692 	}
1693 
1694 	ignore_case = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (g_object_get_data (G_OBJECT (assistant),
1695 																					  "check_option_3")));
1696 	use_regex = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (g_object_get_data (G_OBJECT (assistant),
1697 																					"check_option_4")));
1698     payee_list_tmp = gsb_data_payee_get_payees_list ();
1699     treeview = g_object_get_data (G_OBJECT (assistant), "treeview");
1700     list_store = GTK_LIST_STORE (gtk_tree_view_get_model (treeview));
1701     gtk_list_store_clear (list_store);
1702 
1703     while (payee_list_tmp)
1704     {
1705         gint tmp_payee_number;
1706         const gchar *tmpstr;
1707 
1708         tmp_payee_number = gsb_data_payee_get_no_payee (payee_list_tmp->data);
1709         tmpstr = gsb_data_payee_get_name (tmp_payee_number, FALSE);
1710         if (gsb_string_is_trouve (tmpstr, str_cherche, ignore_case, use_regex))
1711         {
1712             if (!g_slist_find (sup_payees, GINT_TO_POINTER (tmp_payee_number)))
1713             {
1714                 sup_payees = g_slist_append (sup_payees,
1715                         GINT_TO_POINTER (tmp_payee_number));
1716             }
1717             gtk_list_store_append (GTK_LIST_STORE (list_store), &iter);
1718             gtk_list_store_set (GTK_LIST_STORE (list_store), &iter,
1719                         COLUMN_BOOLEAN,  TRUE,
1720                         COLUMN_INT, tmp_payee_number,
1721                         COLUMN_STRING, tmpstr,
1722                         -1);
1723             i++;
1724         }
1725         payee_list_tmp = payee_list_tmp->next;
1726     }
1727 
1728     if (i > 0)
1729     {
1730         label = g_object_get_data (G_OBJECT (assistant), "nbre_tiers_total");
1731         str = g_strdup_printf ("%d", i);
1732         gtk_label_set_text (GTK_LABEL (label), str);
1733         g_free (str);
1734 
1735         label = g_object_get_data (G_OBJECT (assistant), "nbre_tiers_select");
1736         str = g_strdup_printf ("%d", i);
1737         gtk_label_set_text (GTK_LABEL (label), str);
1738         g_free (str);
1739 
1740         g_slist_free (g_object_get_data (G_OBJECT (assistant), "sup_payees"));
1741         g_object_set_data (G_OBJECT (assistant), "sup_payees", sup_payees);
1742     }
1743     return FALSE;
1744 }
1745 
1746 /**
1747  *
1748  *
1749  * \param
1750  *
1751  * \return
1752  **/
gsb_assistant_payees_enter_page_finish(GtkWidget * assistant)1753 static gboolean gsb_assistant_payees_enter_page_finish (GtkWidget *assistant)
1754 {
1755     GtkLabel *label;
1756     GtkWidget *combo;
1757     GSList *sup_payees;
1758     gchar *tmpstr;
1759     const gchar *str_cherche;
1760     gchar *str_replace_wildcard;
1761 
1762     devel_debug ("Enter page finish");
1763     sup_payees = g_object_get_data (G_OBJECT (assistant), "sup_payees");
1764     combo = g_object_get_data (G_OBJECT (assistant), "payee");
1765     str_cherche = gtk_combofix_get_text (GTK_COMBOFIX (combo));
1766     combo = g_object_get_data (G_OBJECT (assistant), "new_payee");
1767     str_replace_wildcard = gsb_string_remplace_joker (str_cherche, (gchar*)"...");
1768 
1769     if (g_slist_length (sup_payees) == 1)
1770     {
1771 		tmpstr = g_strdup_printf (_("You are about to replace one payee which name contain %s by %s\n\n"
1772 									"Are you sure?"),
1773 								  str_replace_wildcard,
1774 								  gtk_combofix_get_text (GTK_COMBOFIX (combo)));
1775     }
1776     else
1777     {
1778 		tmpstr = g_markup_printf_escaped (_("You are about to replace %d payees whose names contain %s by %s\n\n"
1779 											"Are you sure?"),
1780 										  g_slist_length (sup_payees),
1781 										  str_replace_wildcard,
1782 										  gtk_combofix_get_text (GTK_COMBOFIX (combo)));
1783     }
1784     label = g_object_get_data (G_OBJECT (assistant), "finish_label");
1785     gtk_label_set_markup (label, tmpstr);
1786 
1787     g_free (str_replace_wildcard);
1788     g_free (tmpstr);
1789 
1790     return FALSE;
1791 }
1792 
1793 /**
1794  *
1795  *
1796  * \param
1797  *
1798  * \return
1799  **/
gsb_assistant_payees_modifie_operations(GSList * sup_payees,gint transaction_number,gint new_payee_number,gboolean save_notes,gboolean extract_num,gboolean is_transaction)1800 static void gsb_assistant_payees_modifie_operations (GSList *sup_payees,
1801                         gint transaction_number,
1802                         gint new_payee_number,
1803                         gboolean save_notes,
1804                         gboolean extract_num,
1805                         gboolean is_transaction)
1806 {
1807     gchar *tmpstr;
1808     gint payee_number;
1809     gchar *nombre;
1810 	gboolean question = TRUE;
1811 
1812     payee_number = gsb_data_mix_get_party_number (transaction_number, is_transaction);
1813     if (g_slist_find (sup_payees, GINT_TO_POINTER (payee_number)))
1814     {
1815         gsb_data_mix_set_party_number (transaction_number, new_payee_number, is_transaction);
1816         if (save_notes)
1817         {
1818             tmpstr = g_strdup (gsb_data_mix_get_notes (transaction_number, is_transaction));
1819             if (tmpstr && strlen (tmpstr))
1820             {
1821                 overwrite_payee.message = g_strdup_printf (_("Do you want overwrite the existing note.\n\n"
1822 															 "If you answer YES, the existing note will be"
1823 															 " replaced by %s."),
1824 														   gsb_data_payee_get_name (payee_number, TRUE));
1825 
1826                 if (dialogue_conditional_yes_no_with_struct (&overwrite_payee) == FALSE)
1827 				{
1828                     overwrite_payee.default_answer = FALSE;
1829 					question = FALSE;
1830 				}
1831 				else
1832 				{
1833 					overwrite_payee.default_answer = TRUE;
1834 					question = TRUE;
1835 				}
1836 
1837                 g_free ((gchar*) overwrite_payee.message);
1838                 g_free (tmpstr);
1839             }
1840             else
1841                 question = TRUE;
1842 
1843 			if (question
1844 			    &&
1845 				my_strcmp ((gchar *) gsb_data_payee_get_name (payee_number, TRUE),
1846 						   (gchar *) gsb_data_payee_get_name (new_payee_number, TRUE)) != 0)
1847 			{
1848 				gsb_data_mix_set_notes (transaction_number,
1849 										gsb_data_payee_get_name (payee_number, TRUE),
1850 										is_transaction);
1851 			}
1852         }
1853         if (extract_num)
1854         {
1855             nombre = gsb_string_extract_int (gsb_data_payee_get_name (payee_number, FALSE));
1856             gsb_data_mix_set_method_of_payment_content (transaction_number, nombre, is_transaction);
1857             g_free (nombre);
1858         }
1859     }
1860 }
1861 
1862 /******************************************************************************/
1863 /* Public functions                                                           */
1864 /******************************************************************************/
1865 /**
1866  * assistant pour nettoyer les tiers
1867  *
1868  * \param
1869  *
1870  * \return
1871  **/
payees_manage_payees_with_rule(const gchar * rule)1872 void payees_manage_payees_with_rule (const gchar *rule)
1873 {
1874     GtkWidget *assistant;
1875     GtkResponseType return_value;
1876 
1877     devel_debug ("PAGE 1");
1878 
1879     assistant = gsb_assistant_new (_("Manage the payees"),
1880                         _("This wizard will help you to simplify the list of payees.\n\n"
1881                         "Warning the changes you will make be irreparable.\n\n"
1882                         "It is better to make a backup of your Grisbi file if you have not yet done."),
1883                         "gsb-payees-32.png",
1884                         NULL);
1885 	/* récupère le paramètre rule si il existe */
1886 	if (rule)
1887 		g_object_set_data_full (G_OBJECT (assistant), "rule", g_strdup (rule),(GDestroyNotify) g_free);
1888 
1889 	gsb_assistant_add_page (assistant,
1890                         gsb_assistant_payees_page_2 (assistant),
1891                         PAYEES_ASSISTANT_PAGE_2,
1892                         PAYEES_ASSISTANT_INTRO,
1893                         PAYEES_ASSISTANT_PAGE_3,
1894                             G_CALLBACK (gsb_assistant_payees_enter_page_2));
1895 
1896     gsb_assistant_add_page (assistant,
1897                         gsb_assistant_payees_page_3 (assistant),
1898                     PAYEES_ASSISTANT_PAGE_3,
1899                     PAYEES_ASSISTANT_PAGE_2,
1900                     PAYEES_ASSISTANT_PAGE_FINISH,
1901                     G_CALLBACK (gsb_assistant_payees_enter_page_3));
1902 
1903     gsb_assistant_add_page (assistant,
1904                     gsb_assistant_payees_page_finish (assistant),
1905                     PAYEES_ASSISTANT_PAGE_FINISH,
1906                     PAYEES_ASSISTANT_PAGE_3,
1907                     0,
1908                     G_CALLBACK (gsb_assistant_payees_enter_page_finish));
1909 
1910     return_value = gsb_assistant_run (assistant);
1911 
1912     if (return_value == GTK_RESPONSE_APPLY)
1913     {
1914         GSList *sup_payees;
1915         GSList *tmp_list;
1916         GtkTreeSelection *selection;
1917         GtkTreeIter *iter;
1918         GtkTreePath *path = NULL;
1919         GtkWidget *combo;
1920         const gchar *str_cherche;
1921         gchar *tmpstr;
1922         gint new_payee_number = 0;
1923         gint nb_removed;
1924 		gint nb_selected;			/* nbre de tiers concernés par la fusion */
1925 		gint ignore_case;
1926 		gint use_regex;
1927         gboolean save_notes = FALSE;
1928         gboolean extract_num = FALSE;
1929 		gboolean replace_rule = FALSE;
1930 
1931         /* on remplace les anciens tiers par le nouveau et on sauvegarde si nécessaire */
1932         grisbi_win_status_bar_wait (TRUE);
1933 
1934         sup_payees = g_object_get_data (G_OBJECT (assistant), "sup_payees");
1935 		nb_selected = g_slist_length (sup_payees);
1936         if (nb_selected == 1)
1937 		{
1938             new_payee_number = GPOINTER_TO_INT (sup_payees->data);
1939 		}
1940         else
1941 		{
1942 			const gchar *text;
1943 
1944 			combo = g_object_get_data (G_OBJECT (assistant), "new_payee");
1945 			text = gtk_combofix_get_text (GTK_COMBOFIX (combo));
1946             new_payee_number = gsb_data_payee_get_number_by_name (text, TRUE);
1947 		}
1948 
1949 		/* on sauvegarde la chaine de recherche */
1950         combo = g_object_get_data (G_OBJECT (assistant), "payee");
1951         str_cherche = gtk_combofix_get_text (GTK_COMBOFIX (combo));
1952         extract_num = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (
1953                         g_object_get_data (G_OBJECT (assistant),
1954                         "check_option_1")));
1955         save_notes = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (
1956                         g_object_get_data (G_OBJECT (assistant),
1957                         "check_option_2")));
1958 
1959 		ignore_case = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (g_object_get_data (G_OBJECT (assistant),
1960 																						  "check_option_3")));
1961 		gsb_data_payee_set_ignore_case (new_payee_number, ignore_case);
1962 
1963 		use_regex = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (g_object_get_data (G_OBJECT (assistant),
1964 																						  "check_option_4")));
1965 		gsb_data_payee_set_use_regex (new_payee_number, use_regex);
1966 
1967 		replace_rule= gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (g_object_get_data (G_OBJECT (assistant),
1968 																						  "check_option_5")));
1969 		/* on remplace éventuellement la chaine de recherche si le nouveau tiers en a une */
1970 		if (replace_rule)
1971 			gsb_import_associations_remove_assoc (new_payee_number);
1972 
1973         /* on ajoute la nouvelle association à la liste des assoc */
1974 		gsb_import_associations_add_assoc (new_payee_number, str_cherche, ignore_case, use_regex);
1975 
1976 		if (nb_selected > 1)
1977         {
1978 			if (save_notes)
1979 			{
1980 				overwrite_payee.name = g_strdup ("crush-existing-note");
1981 				overwrite_payee.hint = g_strdup (_("Warning you will crush the existing note."));
1982 				overwrite_payee.hidden = FALSE;
1983 				overwrite_payee.default_answer = FALSE;
1984 			}
1985 
1986             tmp_list = gsb_data_transaction_get_complete_transactions_list ();
1987             while (tmp_list)
1988             {
1989                 gint transaction_number;
1990 
1991                 transaction_number = gsb_data_transaction_get_transaction_number (
1992                         tmp_list->data);
1993                 gsb_assistant_payees_modifie_operations (sup_payees,
1994                         transaction_number,
1995                         new_payee_number,
1996                         save_notes,
1997                         extract_num,
1998                         TRUE);
1999                 tmp_list = tmp_list->next;
2000             }
2001             transaction_list_update_element (ELEMENT_PARTY);
2002 
2003             /* on fait la même chose pour les opérations planifiées */
2004             tmp_list = gsb_data_scheduled_get_scheduled_list ();
2005 
2006             while (tmp_list)
2007             {
2008                 gint scheduled_number;
2009 
2010                 scheduled_number = gsb_data_scheduled_get_scheduled_number (
2011                         tmp_list->data);
2012                 gsb_assistant_payees_modifie_operations (sup_payees,
2013                         scheduled_number,
2014                         new_payee_number,
2015                         save_notes,
2016                         extract_num,
2017                         FALSE);
2018                 tmp_list = tmp_list->next;
2019             }
2020             /* on efface les tiers inutilisés */
2021             nb_removed = gsb_data_payee_remove_unused ();
2022             payees_fill_list ();
2023             if (nb_removed == 1)
2024             {
2025                 tmpstr = g_strdup_printf (_("One payee was replaced with a new one."));
2026             }
2027             else if (nb_removed != nb_selected)
2028             {
2029                 tmpstr = g_strdup_printf (_("%d payees were replaced with a new one.\n\n"
2030 											"%d unaffected payees were removed in addition"),
2031 										  nb_selected,
2032 										  nb_removed - nb_selected);
2033             }
2034             else
2035             {
2036                 tmpstr = g_strdup_printf (_("%d payees were replaced with a new one."),
2037                             nb_removed);
2038             }
2039             dialogue (tmpstr);
2040             g_free (tmpstr);
2041 			if (save_notes)
2042 			{
2043 				g_free ((gpointer)overwrite_payee.name);
2044 				g_free ((gpointer)overwrite_payee.hint);
2045 			}
2046         }
2047         else
2048         {
2049 			const gchar *text;
2050 
2051 			combo = g_object_get_data (G_OBJECT (assistant), "new_payee");
2052 			text = gtk_combofix_get_text (GTK_COMBOFIX (combo));
2053             gsb_data_payee_set_name (new_payee_number, text);
2054             payees_fill_list ();
2055         }
2056 
2057         gsb_file_set_modified (TRUE);
2058 
2059 		if (gsb_gui_navigation_get_current_page () == GSB_PAYEES_PAGE)
2060 		{
2061 			/* On sélectionne le nouveau tiers */
2062 			iter = get_iter_from_div (GTK_TREE_MODEL (payee_tree_model), new_payee_number, 0);
2063 			path = gtk_tree_model_get_path (GTK_TREE_MODEL (payee_tree_model), iter);
2064 
2065 			/* et on centre l'affichage dessus */
2066 			selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (payee_tree));
2067 			gtk_tree_selection_select_iter (selection, iter);
2068 			gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (payee_tree), path, NULL, TRUE, 0.5, 0.5);
2069 			gtk_tree_path_free (path);
2070 			grisbi_win_status_bar_stop_wait (TRUE);
2071 		}
2072     }
2073 
2074     g_slist_free (g_object_get_data (G_OBJECT (assistant), "sup_payees"));
2075     gtk_widget_destroy (assistant);
2076 }
2077 
2078 /**
2079  * cette fonction ne sert qu'aux appels à partir d'un (sous-) menu
2080  * donc sans paramètres à récupérer.
2081  *
2082  * \param
2083  *
2084  * \return
2085  **/
payees_manage_payees(void)2086 void payees_manage_payees (void)
2087 {
2088 	payees_manage_payees_with_rule (NULL);
2089 }
2090 
2091 /**
2092  *
2093  *
2094  * \param
2095  *
2096  * \return
2097  **/
2098 /* Local Variables: */
2099 /* c-basic-offset: 4 */
2100 /* End: */
2101