GnuCash c935c2f+
Loading...
Searching...
No Matches
dialog-ab-select-imexporter.c
1/*
2 * dialog-ab-select-imexporter.c --
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation; either version 2 of
7 * the License, or (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, contact:
16 *
17 * Free Software Foundation Voice: +1-617-542-5942
18 * 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652
19 * Boston, MA 02110-1301, USA gnu@gnu.org
20 */
21
29#include <config.h>
30
31#include <stdbool.h>
32#include <glib/gi18n.h>
34#include <dialog-utils.h>
35
36__attribute__((unused)) static QofLogModule log_module = G_LOG_DOMAIN;
37
38struct _GncABSelectImExDlg
39{
40 GtkWidget *dialog;
41 GtkWidget *parent;
42 GtkListStore *imexporter_list;
43 GtkListStore *profile_list;
44 GtkWidget *select_imexporter;
45 GtkWidget *select_profile;
46 GtkWidget *ok_button;
47
48 AB_BANKING* abi;
49};
50
51// Expose the selection handlers to GtkBuilder.
52static gboolean imexporter_changed(GtkTreeSelection* sel,
53 gpointer data);
54static gboolean profile_changed(GtkTreeSelection* sel, gpointer data);
55
56enum
57{
58 NAME_COL,
59 PROF_COL
60};
61
62static void
63populate_list_store (GtkListStore* model, GList* entries)
64{
65 gtk_list_store_clear (model);
66 for (GList* node = entries; node; node = g_list_next (node))
67 {
68 AB_Node_Pair *pair = (AB_Node_Pair*)(node->data);
69 GtkTreeIter iter;
70 gtk_list_store_insert_with_values (GTK_LIST_STORE (model),
71 &iter, -1,
72 NAME_COL, pair->name,
73 PROF_COL, pair->descr,
74 -1);
75 g_slice_free1 (sizeof(AB_Node_Pair), pair);
76 }
77}
78
79GncABSelectImExDlg*
80gnc_ab_select_imex_dlg_new (GtkWidget* parent, AB_BANKING* abi)
81{
82 GncABSelectImExDlg* imexd;
83 GtkBuilder* builder;
84 GList* imexporters;
85 GtkTreeSelection *imex_select = NULL, *prof_select = NULL;
86
87 g_return_val_if_fail (abi, NULL);
88 imexporters = gnc_ab_imexporter_list (abi);
89 g_return_val_if_fail (imexporters, NULL);
90 imexd = g_new0(GncABSelectImExDlg, 1);
91 imexd->parent = parent;
92 imexd->abi = abi;
93
94 g_signal_connect (parent, "destroy",
95 G_CALLBACK (gtk_widget_destroyed), &imexd->parent);
96 builder = gtk_builder_new();
97 gnc_builder_add_from_file (builder, "dialog-ab.glade", "imexporter-list");
98 gnc_builder_add_from_file (builder, "dialog-ab.glade", "profile-list");
99 gnc_builder_add_from_file (builder, "dialog-ab.glade",
100 "aqbanking-select-imexporter-dialog");
101 imexd->dialog =
102 GTK_WIDGET (gtk_builder_get_object (builder,
103 "aqbanking-select-imexporter-dialog"));
104 g_signal_connect (imexd->dialog, "destroy",
105 G_CALLBACK (gtk_widget_destroyed), &imexd->dialog);
106 imexd->imexporter_list =
107 GTK_LIST_STORE (gtk_builder_get_object (builder, "imexporter-list"));
108 imexd->profile_list =
109 GTK_LIST_STORE (gtk_builder_get_object (builder, "profile-list"));
110 imexd->select_imexporter =
111 GTK_WIDGET (gtk_builder_get_object (builder, "imexporter-sel"));
112 imexd->select_profile =
113 GTK_WIDGET (gtk_builder_get_object (builder, "profile-sel"));
114 imexd->ok_button =
115 GTK_WIDGET (gtk_builder_get_object (builder, "imex-okbutton"));
116
117 imex_select = GTK_TREE_SELECTION (gtk_builder_get_object (builder, "imex-selection"));
118 prof_select = GTK_TREE_SELECTION (gtk_builder_get_object (builder, "prof-selection"));
119 populate_list_store (imexd->imexporter_list,
120 imexporters);
121
122 g_signal_connect (imex_select, "changed", G_CALLBACK(imexporter_changed),
123 imexd);
124 g_signal_connect (prof_select, "changed", G_CALLBACK(profile_changed),
125 imexd);
126 g_list_free (imexporters);
127 g_object_unref (G_OBJECT (builder));
128
129 gtk_window_set_transient_for (GTK_WINDOW (imexd->dialog),
130 GTK_WINDOW (imexd->parent));
131
132 return imexd;
133}
134
135void
136gnc_ab_select_imex_dlg_destroy (GncABSelectImExDlg* imexd)
137{
138
139 if (imexd->imexporter_list)
140 gtk_list_store_clear (imexd->imexporter_list);
141
142 if (imexd->profile_list)
143 gtk_list_store_clear (imexd->profile_list);
144
145 if (imexd->dialog)
146 gtk_widget_destroy (imexd->dialog);
147
148 g_free (imexd);
149}
150
151gboolean
152imexporter_changed(GtkTreeSelection* sel, gpointer data)
153{
154 GncABSelectImExDlg* imexd = (GncABSelectImExDlg*)data;
155 GtkTreeIter iter;
156 GtkTreeModel* model;
157
158 gtk_widget_set_sensitive (imexd->ok_button, FALSE);
159
160 if (gtk_tree_selection_get_selected (sel, &model, &iter))
161 {
162 char* name = NULL;
163 GList* profiles = NULL;
164
165 gtk_tree_model_get (model, &iter, NAME_COL, &name, -1);
166 if (name && *name)
167 profiles = gnc_ab_imexporter_profile_list (imexd->abi, name);
168
169 g_free (name);
170 gtk_list_store_clear (imexd->profile_list);
171
172 if (profiles)
173 {
174 populate_list_store (imexd->profile_list, profiles);
175 }
176 else
177 {
178 gtk_widget_set_sensitive (imexd->ok_button, TRUE);
179 return FALSE;
180 }
181
182 if (!profiles->next)
183 {
184 GtkTreePath* path = gtk_tree_path_new_first();
185 GtkTreeSelection* profile_sel =
186 gtk_tree_view_get_selection (GTK_TREE_VIEW (imexd->select_profile));
187 gtk_tree_selection_select_path (profile_sel, path); //should call profile_changed
188 gtk_tree_path_free (path);
189 }
190 return FALSE;
191 }
192 return TRUE;
193}
194
195gboolean
196profile_changed (GtkTreeSelection* sel, gpointer data)
197{
198 GncABSelectImExDlg* imexd = (GncABSelectImExDlg*)data;
199 GtkTreeIter iter;
200 GtkTreeModel* model;
201
202 gtk_widget_set_sensitive (imexd->ok_button, FALSE);
203
204 if (gtk_tree_selection_get_selected (sel, &model, &iter))
205 {
206 gtk_widget_set_sensitive (imexd->ok_button, TRUE);
207 return FALSE;
208 }
209
210 return TRUE;
211}
212
213gboolean
214gnc_ab_select_imex_dlg_run (GncABSelectImExDlg* imexd)
215{
216
217 int response = gtk_dialog_run (GTK_DIALOG (imexd->dialog));
218 return response == GTK_RESPONSE_OK ? TRUE : FALSE;
219}
220
221static char*
222tree_view_get_name (GtkTreeView *tv)
223{
224 GtkTreeSelection* sel = gtk_tree_view_get_selection (tv);
225 GtkTreeIter iter;
226 GtkTreeModel* model;
227 if (sel && gtk_tree_selection_get_selected (sel, &model, &iter))
228 {
229 char* name;
230 gtk_tree_model_get(model, &iter, NAME_COL, &name, -1);
231 return name;
232 }
233
234 return NULL;
235}
236
237static void
238tree_view_set_name (GtkTreeView *tree, const char* name)
239{
240 GtkTreeIter iter;
241 GtkTreeModel* model = gtk_tree_view_get_model(tree);
242 bool found = false;
243
244 if (!gtk_tree_model_get_iter_first(model, &iter))
245 return;
246 do
247 {
248 char* row_name;
249 gtk_tree_model_get(model, &iter, NAME_COL, &row_name, -1);
250 if (!g_strcmp0(name, row_name))
251 {
252 found = true;
253 break;
254 }
255 }
256 while(gtk_tree_model_iter_next(model, &iter));
257
258 if (found)
259 {
260 GtkTreeSelection *sel = gtk_tree_view_get_selection(tree);
261 gtk_tree_selection_select_iter(sel, &iter);
262 }
263}
264
265char*
267{
268 return tree_view_get_name (GTK_TREE_VIEW (imexd->select_imexporter));
269}
270
271char*
273{
274 return tree_view_get_name (GTK_TREE_VIEW (imexd->select_profile));
275}
276
277void
278gnc_ab_select_imex_dlg_set_imexporter_name (GncABSelectImExDlg* imexd, const char* name)
279{
280 if (name)
281 tree_view_set_name (GTK_TREE_VIEW (imexd->select_imexporter), name);
282}
283
284void
285gnc_ab_select_imex_dlg_set_profile_name (GncABSelectImExDlg* imexd, const char* name)
286{
287 if (name)
288 tree_view_set_name (GTK_TREE_VIEW (imexd->select_profile), name);
289}
Dialog to select AQBanking importer/exporter and format profile.
GList * gnc_ab_imexporter_list(AB_BANKING *api)
Retrieve the available AQBanking importers.
void gnc_ab_select_imex_dlg_destroy(GncABSelectImExDlg *imexd)
Destroy an AQBanking importer/exporter selection dialog.
GList * gnc_ab_imexporter_profile_list(AB_BANKING *api, const char *importer_name)
Retrieve the available format templates for an AQBanking importer.
char * gnc_ab_select_imex_dlg_get_imexporter_name(GncABSelectImExDlg *imexd)
Get the selected importer/exporter name.
void gnc_ab_select_imex_dlg_set_profile_name(GncABSelectImExDlg *imexd, const char *name)
Get the selected file format profile name.
char * gnc_ab_select_imex_dlg_get_profile_name(GncABSelectImExDlg *imexd)
Get the selected file format profile name.
GncABSelectImExDlg * gnc_ab_select_imex_dlg_new(GtkWidget *parent, AB_BANKING *abi)
Create an AQBanking importer/exporter selection dialog.
gboolean gnc_ab_select_imex_dlg_run(GncABSelectImExDlg *imexd)
Run an AQBanking importer/exporter selection dialog.
void gnc_ab_select_imex_dlg_set_imexporter_name(GncABSelectImExDlg *imexd, const char *name)
Get the selected importer/exporter name.