/** * callback called when toggle a radio button of an archive * we want only 1 toggle, so erase the others before * * \param renderer * \param path * \param assistant * * \return FALSE * */ static gboolean gsb_assistant_archive_export_toggled ( GtkCellRendererToggle *renderer, gchar *path_string, GtkWidget *assistant ) { GtkTreeIter iter; gboolean value; GtkTreePath *path; GtkTreePath *path_clicked; GtkTreeModel *model; gboolean selected = FALSE; model = gtk_tree_view_get_model (GTK_TREE_VIEW (archive_export_treeview)); path_clicked = gtk_tree_path_new_from_string (path_string); path = gtk_tree_path_new_first (); while (gtk_tree_model_get_iter ( GTK_TREE_MODEL (model), &iter, path )) { /* if we are on the clicked path, we invert the value, * else, we set the value to 0 */ if (gtk_tree_path_compare (path, path_clicked)) /* the 2 path are different */ value = 0; else { /* the paths are equal */ gtk_tree_model_get ( GTK_TREE_MODEL (model), &iter, ARCHIVES_EXPORT_SELECT_COLUMN, &value, -1 ); value = !value; /* we will unsensitive the next button only if something chosen */ if (value) selected = TRUE; } gtk_list_store_set ( GTK_LIST_STORE (model), &iter, ARCHIVES_EXPORT_SELECT_COLUMN, value, -1 ); gtk_tree_path_next (path); } gtk_tree_path_free (path); gtk_tree_path_free (path_clicked); gsb_assistant_sensitive_button_next (assistant, selected); return FALSE; }
/** * Run the Grisbi assistant. This will pop up a new dialog. * * \param assistant Grisbi assistant to run. * * \return Outcome of the Grisbi assistant. Can be * GTK_RESPONSE_APPLY for success and * GTK_RESPONSE_CANCEL for failure * (user canceled or closed dialog). */ GtkResponseType gsb_assistant_run ( GtkWidget * assistant ) { GtkWidget * notebook, * button_prev; GtkWidget *button_select; button_prev = g_object_get_data ( G_OBJECT(assistant), "button_prev" ); button_select = g_object_get_data ( G_OBJECT ( assistant ), "button_select" ); gtk_widget_show_all ( assistant ); gtk_widget_hide ( button_select ); notebook = g_object_get_data ( G_OBJECT(assistant), "notebook" ); gtk_notebook_set_current_page ( GTK_NOTEBOOK (notebook), 0 ); gtk_widget_grab_focus (GTK_WIDGET (g_object_get_data (G_OBJECT (assistant), "button_next"))); while ( TRUE ) { gint current = gtk_notebook_get_current_page ( GTK_NOTEBOOK(notebook) ); gint result, prev, next; gchar* tmpstr = g_strdup_printf ( _("%s (%d of %d)"), (gchar *) g_object_get_data ( G_OBJECT(assistant), "title" ), current + 1, gtk_notebook_get_n_pages ( GTK_NOTEBOOK(notebook) ) ); gtk_window_set_title ( GTK_WINDOW(assistant), tmpstr); g_free ( tmpstr ); result = gtk_dialog_run ( GTK_DIALOG(assistant) ); tmpstr = g_strdup_printf ( "prev%d", current ); prev = GPOINTER_TO_INT( g_object_get_data ( G_OBJECT(assistant), tmpstr )); g_free ( tmpstr ); tmpstr = g_strdup_printf ( "next%d", current ); next = GPOINTER_TO_INT( g_object_get_data ( G_OBJECT(assistant), tmpstr)); g_free ( tmpstr ); switch ( result ) { case GTK_RESPONSE_YES: gtk_widget_set_sensitive ( button_prev, TRUE ); if ( gtk_notebook_get_n_pages ( GTK_NOTEBOOK(notebook) ) == ( next + 1 ) ) { gsb_assistant_change_button_next ( assistant, GTK_STOCK_CLOSE, GTK_RESPONSE_APPLY ); gsb_assistant_sensitive_button_prev ( assistant, FALSE ); } gtk_notebook_set_current_page ( GTK_NOTEBOOK(notebook), next ); break; case GTK_RESPONSE_NO: if ( next == -1 ) { gsb_assistant_change_button_next ( assistant, GTK_STOCK_GO_FORWARD, GTK_RESPONSE_YES ); } gsb_assistant_sensitive_button_next ( assistant, TRUE ); if ( prev == 0 ) { gtk_widget_set_sensitive ( button_prev, FALSE ); } gtk_notebook_set_current_page ( GTK_NOTEBOOK(notebook), prev ); break; case GTK_RESPONSE_APPLY: return GTK_RESPONSE_APPLY; default: case GTK_RESPONSE_CANCEL: return GTK_RESPONSE_CANCEL; } } return GTK_RESPONSE_CANCEL; }
/** * called when switch page * * \param assistant * \param new_page * * \return FALSE * */ static gboolean gsb_assistant_archive_switch ( GtkWidget *assistant, gint new_page ) { gint archive_number; GtkTreeModel *model; const gchar *export_name; gboolean success = FALSE; gchar* tmpstr; model = gtk_tree_view_get_model (GTK_TREE_VIEW (archive_export_treeview)); archive_number = gsb_assistant_archive_export_get_selected_archive (model); switch (new_page) { case ARCHIVE_EXPORT_ASSISTANT_INTRO: break; case ARCHIVE_EXPORT_ASSISTANT_CHOOSE: if (archive_number) gsb_assistant_sensitive_button_next (assistant, TRUE); else gsb_assistant_sensitive_button_next (assistant, FALSE); break; case ARCHIVE_EXPORT_ASSISTANT_NAME: /* if we come here, an archive must have been selected, * so needn't to check */ tmpstr = g_markup_printf_escaped ( _("<span size=\"x-large\">Exporting the archive: %s</span>"), gsb_data_archive_get_name (archive_number)); gtk_label_set_markup ( GTK_LABEL ( archive_export_label ), tmpstr); g_free ( tmpstr ); /* on remplace les slash des dates par des points * avant de fixer le nom du fichier par défaut */ tmpstr = ( gchar * )gsb_data_archive_get_name ( archive_number ); tmpstr = my_strdelimit (tmpstr, "/", "." ); gtk_file_chooser_set_current_name ( GTK_FILE_CHOOSER (archive_export_filechooser), tmpstr ); gtk_file_chooser_set_current_folder ( GTK_FILE_CHOOSER (archive_export_filechooser), gsb_file_get_last_path () ); g_free ( tmpstr ); /* need to set the next button to the next function, * because if the export failed and the user did previous button, * the next button stay in the close state */ gsb_assistant_change_button_next ( assistant, GTK_STOCK_GO_FORWARD, GTK_RESPONSE_YES ); break; case ARCHIVE_EXPORT_ASSISTANT_SUCCESS: export_name = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (archive_export_filechooser)); switch (gtk_combo_box_get_active (GTK_COMBO_BOX(archive_export_combobox))) { case 0: /* GSB format */ /* the gsb_file_save_save_file function write directly, so we need to check before * if the file exists */ /* on vérifie juste que l'extension existe */ if ( ! g_strrstr ( export_name, ".gsb" ) ) { export_name = g_strconcat ( export_name, ".gsb", NULL ); } success = gsb_file_util_test_overwrite (export_name) && gsb_file_save_save_file ( export_name, conf.compress_backup, archive_number); break; case 1: /* QIF format */ if ( ! g_strrstr ( export_name, ".qif" ) ) { export_name = g_strconcat ( export_name, ".qif", NULL ); } success = gsb_qif_export_archive ( export_name, archive_number); break; case 2: /* CSV format */ if ( ! g_strrstr ( export_name, ".csv" ) ) { export_name = g_strconcat ( export_name, ".csv", NULL ); } success = gsb_csv_export_archive ( export_name, archive_number); break; } /* now success = TRUE or FALSE, show the good final page of assistant */ if (success) gtk_label_set_text ( GTK_LABEL (archive_export_label_success), _("Success!\nThe export of the archive finished successfully.\n\nYou can now close the assistant.")); else { gtk_label_set_text ( GTK_LABEL (archive_export_label_success), _("Error!\nAn error occured while saving the archive.\n\nPlease press the Previous button to correct the problem,\nor the close button to cancel the action.")); gsb_assistant_sensitive_button_prev ( assistant, TRUE ); } } return FALSE; }