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