GnuCash  5.6-150-g038405b370+
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 
38 struct _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.
52 static gboolean imexporter_changed(GtkTreeSelection* sel,
53  gpointer data);
54 static gboolean profile_changed(GtkTreeSelection* sel, gpointer data);
55 
56 enum
57 {
58  NAME_COL,
59  PROF_COL
60 };
61 
62 static void
63 populate_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 
79 GncABSelectImExDlg*
80 gnc_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 
135 void
136 gnc_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 
151 gboolean
152 imexporter_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 
195 gboolean
196 profile_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 
213 gboolean
214 gnc_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 
221 static char*
222 tree_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 
237 static void
238 tree_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 
265 char*
267 {
268  return tree_view_get_name (GTK_TREE_VIEW (imexd->select_imexporter));
269 }
270 
271 char*
272 gnc_ab_select_imex_dlg_get_profile_name (GncABSelectImExDlg* imexd)
273 {
274  return tree_view_get_name (GTK_TREE_VIEW (imexd->select_profile));
275 }
276 
277 void
278 gnc_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 
284 void
285 gnc_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 }
GList * gnc_ab_imexporter_list(AB_BANKING *api)
Retrieve the available AQBanking importers.
#define G_LOG_DOMAIN
Functions providing the SX List as a plugin page.
char * gnc_ab_select_imex_dlg_get_profile_name(GncABSelectImExDlg *imexd)
Get the selected file format profile name.
void gnc_ab_select_imex_dlg_set_imexporter_name(GncABSelectImExDlg *imexd, const char *name)
Get the selected importer/exporter name.
void gnc_ab_select_imex_dlg_destroy(GncABSelectImExDlg *imexd)
Destroy an AQBanking importer/exporter selection dialog.
gboolean gnc_ab_select_imex_dlg_run(GncABSelectImExDlg *imexd)
Run an AQBanking importer/exporter selection dialog.
GncABSelectImExDlg * gnc_ab_select_imex_dlg_new(GtkWidget *parent, AB_BANKING *abi)
Create an AQBanking importer/exporter selection dialog.
void gnc_ab_select_imex_dlg_set_profile_name(GncABSelectImExDlg *imexd, const char *name)
Get the selected file format profile name.
Dialog to select AQBanking importer/exporter and format profile.
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.