/** * Callback called when the payment method name is changed in the * GtkEntry associated. It updates the GtkTreeView list of payment * methods as well as it updates transaction form. * * \param entry the entry changed (payment method name) * \param tree_view * * \return FALSE */ gboolean gsb_payment_method_config_name_changed ( GtkWidget *entry, GtkWidget *tree_view ) { GtkTreeSelection *selection; GtkTreeIter iter; gboolean good; selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)); good = gtk_tree_selection_get_selected (selection, NULL, &iter); if (good) { GtkTreeModel *model; gint payment_number; model = gtk_tree_view_get_model ( GTK_TREE_VIEW (tree_view)); gtk_tree_model_get ( GTK_TREE_MODEL(model), &iter, PAYMENT_METHODS_NUMBER_COLUMN, &payment_number, -1 ); if (payment_number) { /* update the tree view */ gtk_tree_store_set (GTK_TREE_STORE (model), &iter, PAYMENT_METHODS_NAME_COLUMN, gsb_data_payment_get_name (payment_number), -1); gsb_reconcile_sort_config_fill (); if ( gsb_data_form_check_for_value ( TRANSACTION_FORM_TYPE )) { GtkWidget *widget; gint account_number; account_number = gsb_form_get_account_number (); widget = gsb_form_widget_get_widget (TRANSACTION_FORM_TYPE); if (widget) { gsb_payment_method_create_combo_list ( widget, GSB_PAYMENT_DEBIT, account_number, 0, FALSE ); if (GTK_WIDGET_VISIBLE (widget)) { gsb_payment_method_set_combobox_history ( widget, gsb_data_account_get_default_debit (account_number), TRUE ); } else { gtk_widget_hide ( gsb_form_widget_get_widget (TRANSACTION_FORM_CHEQUE)); } } } /* update the transactions list */ transaction_list_update_element (ELEMENT_PAYMENT_TYPE); } } return FALSE; }
/** * Callback called when toggle the check button to split the neutral method of payments * * \param cell * \param path_str * \param tree_view * * \return FALSE */ gboolean gsb_reconcile_sort_config_neutral_toggled ( GtkCellRendererToggle *cell, gchar *path_str, GtkWidget *tree_view ) { GtkTreePath * treepath; GtkTreeIter iter; gboolean toggle; gint account_number; GSList *sorted_list_copy; GSList *tmp_list; GtkTreeModel *model; model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view)); /* invert the toggle */ treepath = gtk_tree_path_new_from_string ( path_str ); gtk_tree_model_get_iter ( GTK_TREE_MODEL (model), &iter, treepath ); gtk_tree_model_get (GTK_TREE_MODEL(model), &iter, RECONCILIATION_SORT_SPLIT_NEUTRAL_COLUMN, &toggle, RECONCILIATION_SORT_ACCOUNT_COLUMN, &account_number, -1); toggle ^= 1; gtk_tree_store_set (GTK_TREE_STORE (model), &iter, RECONCILIATION_SORT_SPLIT_NEUTRAL_COLUMN, toggle, -1); /* and save it */ gsb_data_account_set_split_neutral_payment ( account_number, toggle ); /* need to copy the sorted_list to avoid an infinite loop when add a negative payment neutral later */ sorted_list_copy = g_slist_copy (gsb_data_account_get_sort_list (account_number)); tmp_list = sorted_list_copy; while (tmp_list) { gint payment_number; payment_number = GPOINTER_TO_INT (tmp_list -> data); /* payment_number can be negative, so do for it abs */ if ( gsb_data_payment_get_sign (abs (payment_number)) == GSB_PAYMENT_NEUTRAL ) { if (toggle) gsb_data_account_sort_list_add ( account_number, -payment_number ); else if (payment_number < 0 ) gsb_data_account_sort_list_remove ( account_number, payment_number ); } tmp_list = tmp_list -> next; } g_slist_free (sorted_list_copy); gsb_reconcile_sort_config_fill (); gsb_file_set_modified ( TRUE ); return FALSE; }
/** * callback called when changing the sign type of the method of payment * * \param menu_item the widget wich receive the signal * \param sign a pointer to an int : GSB_PAYMENT_NEUTRAL, GSB_PAYMENT_DEBIT or GSB_PAYMENT_CREDIT * * \return FALSE */ gboolean gsb_payment_method_config_sign_changed ( GtkWidget *menu_item, gint *sign ) { GtkTreeSelection *selection; GtkTreeIter iter; gboolean good; selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (payment_method_treeview)); good = gtk_tree_selection_get_selected (selection, NULL, &iter); if (good) { GtkTreeModel *model; gint payment_number; model = gtk_tree_view_get_model ( GTK_TREE_VIEW (payment_method_treeview)); gtk_tree_model_get ( GTK_TREE_MODEL(model), &iter, PAYMENT_METHODS_NUMBER_COLUMN, &payment_number, -1 ); if (payment_number) { gint account_number; /* Call this callback so that we "unselect" things */ gsb_payment_method_config_select ( selection, payment_method_treeview); account_number = gsb_data_payment_get_account_number (payment_number); /* as we have changed the sign of the method of payment, check if it was the default * for the account, and if yes, change the default for that account */ switch (gsb_data_payment_get_sign (payment_number)) { case GSB_PAYMENT_DEBIT: if ( gsb_data_account_get_default_debit (account_number) == payment_number) { /* the current method of payment was a debit and was the default debit for its account, * so change the default to another debit */ gsb_data_account_set_default_debit ( account_number, gsb_payment_method_config_get_transaction_by_sign (account_number, GSB_PAYMENT_DEBIT, payment_number)); } break; case GSB_PAYMENT_CREDIT: if ( gsb_data_account_get_default_credit (account_number) == payment_number) { /* the current method of payment was a credit and was the default credit for its account, * so change the default to another credit */ gsb_data_account_set_default_credit ( account_number, gsb_payment_method_config_get_transaction_by_sign (account_number, GSB_PAYMENT_CREDIT, payment_number)); } break; } gsb_data_payment_set_sign ( payment_number, GPOINTER_TO_INT (sign)); /* Update tree */ g_signal_handlers_block_by_func ( selection, G_CALLBACK (gsb_payment_method_config_select), model ); gsb_payment_method_config_fill_list (model); gtk_tree_view_expand_all ( GTK_TREE_VIEW(payment_method_treeview) ); g_signal_handlers_unblock_by_func ( selection, G_CALLBACK (gsb_payment_method_config_select), model ); gtk_tree_model_foreach ( GTK_TREE_MODEL (model), (GtkTreeModelForeachFunc) gsb_payment_method_config_foreach_select, GINT_TO_POINTER (payment_number)); /* need to clear and fill the reconciliation tree becaus if it was a neutral changing to credit/debit * and neutral was split... */ gsb_reconcile_sort_config_fill (); } } return FALSE; }
/** * create the config widget for the reconcile * to choose the order of the method of payment to sort the list * while reconciling * * \param * * \return a GtkWidget containing the config widget */ GtkWidget *gsb_reconcile_sort_config_create ( void ) { GtkWidget *hbox, *scrolled_window; GtkWidget *vbox_pref, *paddingbox; GtkTreeViewColumn *column; GtkCellRenderer *cell; GtkWidget *vbox_fleches_tri; GtkTreeStore *reconcile_model; GtkTreeSelection *reconcile_selection; vbox_pref = new_vbox_with_title_and_icon ( _("Sort for reconciliation"), "reconciliationlg.png" ); paddingbox = new_paddingbox_with_title ( vbox_pref, TRUE, _("Reconciliation: sort transactions") ); /* la partie du milieu est une hbox avec les types */ hbox = gtk_hbox_new ( FALSE, 5 ); gtk_box_pack_start ( GTK_BOX ( paddingbox ), hbox, TRUE, TRUE, 0 ); /* mise en place de la liste qui contient les types classés */ scrolled_window = gtk_scrolled_window_new ( NULL, NULL ); gtk_box_pack_start ( GTK_BOX ( hbox ), scrolled_window, TRUE, TRUE, 0); gtk_scrolled_window_set_policy ( GTK_SCROLLED_WINDOW ( scrolled_window ), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); reconcile_model = gtk_tree_store_new ( NUM_RECONCILIATION_SORT_COLUMNS, G_TYPE_STRING, /* Name */ G_TYPE_BOOLEAN, /* Visible */ G_TYPE_BOOLEAN, /* Sort by method of payment */ G_TYPE_BOOLEAN, /* Split neutrals */ G_TYPE_INT, /* Account number */ G_TYPE_INT, /* payment number */ G_TYPE_BOOLEAN ); /* sensitive line */ reconcile_treeview = gtk_tree_view_new_with_model ( GTK_TREE_MODEL (reconcile_model) ); g_object_unref (G_OBJECT(reconcile_model)); gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (reconcile_treeview), TRUE); gtk_tree_selection_set_mode ( gtk_tree_view_get_selection (GTK_TREE_VIEW (reconcile_treeview)), GTK_SELECTION_SINGLE ); reconcile_selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (reconcile_treeview)); g_signal_connect (reconcile_selection, "changed", G_CALLBACK (gsb_reconcile_sort_config_select), reconcile_model); /* Name */ cell = gtk_cell_renderer_text_new ( ); column = gtk_tree_view_column_new ( ); gtk_tree_view_column_pack_end ( column, cell, TRUE ); gtk_tree_view_column_set_title ( column, _("Payment method") ); gtk_tree_view_column_set_attributes (column, cell, "text", RECONCILIATION_SORT_NAME_COLUMN, "sensitive", RECONCILIATION_SORT_SENSITIVE_COLUMN, NULL); gtk_tree_view_column_set_expand ( column, TRUE ); gtk_tree_view_append_column ( GTK_TREE_VIEW(reconcile_treeview), column); /* Sort by date */ cell = gtk_cell_renderer_toggle_new (); gtk_cell_renderer_toggle_set_radio ( GTK_CELL_RENDERER_TOGGLE(cell), FALSE ); g_signal_connect (cell, "toggled", G_CALLBACK (gsb_reconcile_sort_config_payment_toggled), reconcile_treeview); g_object_set (cell, "xalign", 0.5, NULL); column = gtk_tree_view_column_new ( ); gtk_tree_view_column_set_alignment ( column, 0.5 ); gtk_tree_view_column_pack_end ( column, cell, TRUE ); gtk_tree_view_column_set_title ( column, _("Sort by payment method") ); gtk_tree_view_column_set_attributes (column, cell, "active", RECONCILIATION_SORT_SORT_COLUMN, "activatable", RECONCILIATION_SORT_VISIBLE_COLUMN, "visible", RECONCILIATION_SORT_VISIBLE_COLUMN, NULL); gtk_tree_view_column_set_expand ( column, TRUE ); gtk_tree_view_append_column ( GTK_TREE_VIEW(reconcile_treeview), column); /* Split neutral payment methods */ cell = gtk_cell_renderer_toggle_new (); gtk_cell_renderer_toggle_set_radio ( GTK_CELL_RENDERER_TOGGLE(cell), FALSE ); g_signal_connect (cell, "toggled", G_CALLBACK (gsb_reconcile_sort_config_neutral_toggled), reconcile_treeview); g_object_set (cell, "xalign", 0.5, NULL); column = gtk_tree_view_column_new ( ); gtk_tree_view_column_set_alignment ( column, 0.5 ); gtk_tree_view_column_pack_end ( column, cell, TRUE ); gtk_tree_view_column_set_title ( column, _("Split neutral payment methods") ); gtk_tree_view_column_set_attributes (column, cell, "active", RECONCILIATION_SORT_SPLIT_NEUTRAL_COLUMN, "activatable", RECONCILIATION_SORT_VISIBLE_COLUMN, "visible", RECONCILIATION_SORT_VISIBLE_COLUMN, NULL); gtk_tree_view_column_set_expand ( column, TRUE ); gtk_tree_view_append_column ( GTK_TREE_VIEW(reconcile_treeview), column); /* Various remaining settings */ gtk_scrolled_window_set_shadow_type ( GTK_SCROLLED_WINDOW ( scrolled_window ), GTK_SHADOW_IN); gtk_container_add ( GTK_CONTAINER ( scrolled_window ), reconcile_treeview ); gsb_reconcile_sort_config_fill(); /* set the arrows under the list */ vbox_fleches_tri = gtk_hbox_new ( TRUE, 10 ); gtk_box_pack_start ( GTK_BOX (paddingbox), vbox_fleches_tri, FALSE, FALSE, 0); button_move_up = gtk_button_new_from_stock (GTK_STOCK_GO_UP); gtk_button_set_relief ( GTK_BUTTON ( button_move_up ), GTK_RELIEF_NONE ); g_signal_connect ( G_OBJECT ( button_move_up ), "clicked", G_CALLBACK (gsb_reconcile_sort_config_move_up), reconcile_treeview ); gtk_box_pack_start ( GTK_BOX (vbox_fleches_tri), button_move_up, FALSE, FALSE, 0 ); gtk_widget_set_sensitive ( button_move_up, FALSE ); button_move_down = gtk_button_new_from_stock (GTK_STOCK_GO_DOWN); gtk_button_set_relief ( GTK_BUTTON ( button_move_down ), GTK_RELIEF_NONE ); g_signal_connect ( G_OBJECT ( button_move_down ), "clicked", G_CALLBACK (gsb_reconcile_sort_config_move_down), reconcile_treeview); gtk_box_pack_start ( GTK_BOX (vbox_fleches_tri), button_move_down, FALSE, FALSE, 0 ); gtk_widget_set_sensitive ( button_move_down, FALSE ); if ( !gsb_data_account_get_accounts_amount () ) { gtk_widget_set_sensitive ( vbox_pref, FALSE ); } return vbox_pref; }