/**
 * 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;
}
Пример #2
0
/**
 * 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;
}
Пример #4
0
/**
 * 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;
}