33 #include <glib/gi18n.h>
37 #include "gnc-component-manager.h"
38 #include "dialog-utils.h"
39 #include "gnc-gui-query.h"
48 GtkWidget *entryFilename;
57 void gnc_customer_import_gui_ok_cb (GtkWidget *widget, gpointer data);
58 void gnc_customer_import_gui_cancel_cb (GtkWidget *widget, gpointer data);
59 void gnc_customer_import_gui_help_cb (GtkWidget *widget, gpointer data);
60 void gnc_customer_import_gui_destroy_cb (GtkWidget *widget, gpointer data);
61 static void gnc_customer_import_gui_close_handler (gpointer user_data);
62 void gnc_customer_import_gui_buttonOpen_cb (GtkWidget *widget, gpointer data);
63 void gnc_customer_import_gui_filenameChanged_cb (GtkWidget *widget, gpointer data);
64 void gnc_customer_import_gui_option1_cb (GtkWidget *widget, gpointer data);
65 void gnc_customer_import_gui_option2_cb (GtkWidget *widget, gpointer data);
66 void gnc_customer_import_gui_option3_cb (GtkWidget *widget, gpointer data);
67 void gnc_customer_import_gui_option4_cb (GtkWidget *widget, gpointer data);
68 void gnc_customer_import_gui_option5_cb (GtkWidget *widget, gpointer data);
69 void gnc_customer_import_gui_type_cb (GtkWidget *widget, gpointer data);
72 static gchar *gnc_input_dialog (GtkWidget *parent,
const gchar *title,
const gchar *msg,
const gchar *default_input);
73 static void gnc_info2_dialog (GtkWidget *parent,
const gchar *title,
const gchar *msg);
79 CustomerImportGui *gui;
83 GtkCellRenderer *renderer;
84 GtkTreeViewColumn *column;
87 glist = gnc_find_gui_components (
"dialog-customer_import_gui", NULL, NULL);
91 gui = g_list_nth_data (glist, 0);
93 gtk_window_present (GTK_WINDOW(gui->dialog));
98 gui = g_new0 (CustomerImportGui, 1);
100 builder = gtk_builder_new();
101 gnc_builder_add_from_file (builder,
"dialog-customer-import-gui.glade",
"customer_import Dialog");
102 gui->dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"customer_import Dialog"));
103 gui->tree_view = GTK_WIDGET(gtk_builder_get_object (builder,
"treeview1"));
104 gui->entryFilename = GTK_WIDGET(gtk_builder_get_object (builder,
"entryFilename"));
105 gui->type =
"CUSTOMER";
107 gui->regexp = g_string_new (
"^(?<id>[^;]+);(?<company>[^;]*);(?<name>[^;]+);(?<addr1>[^;]+);?(?<addr2>[^;]*);?(?<addr3>[^;]*);?(?<addr4>[^;]*);?(?<phone>[^;]*);?(?<fax>[^;]*);?(?<email>[^;]*);?(?<shipname>[^;]*);?(?<shipaddr1>[^;]*);?(?<shipaddr2>[^;]*);?(?<shipaddr3>[^;]*);?(?<shipaddr4>[^;]*);?(?<shipphone>[^;]*);?(?<shipfax>[^;]*);?(?<shipemail>[^;]*)");
108 gui->book = gnc_get_current_book();
111 gui->store = gtk_list_store_new (CI_N_COLUMNS,
112 G_TYPE_STRING, G_TYPE_STRING,
113 G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
115 G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
116 gtk_tree_view_set_model( GTK_TREE_VIEW(gui->tree_view), GTK_TREE_MODEL(gui->store) );
117 #define CREATE_COLUMN(description,column_id) \
118 renderer = gtk_cell_renderer_text_new (); \
119 column = gtk_tree_view_column_new_with_attributes (description, renderer, "text", column_id, NULL); \
120 gtk_tree_view_column_set_resizable (column, TRUE); \
121 gtk_tree_view_append_column (GTK_TREE_VIEW (gui->tree_view), column);
122 CREATE_COLUMN (
"id", CI_ID);
123 CREATE_COLUMN (
"company", CI_COMPANY);
124 CREATE_COLUMN (
"name", CI_NAME);
125 CREATE_COLUMN (
"addr1", CI_ADDR1);
126 CREATE_COLUMN (
"addr2", CI_ADDR2);
127 CREATE_COLUMN (
"addr3", CI_ADDR3);
128 CREATE_COLUMN (
"addr4", CI_ADDR4);
129 CREATE_COLUMN (
"phone", CI_PHONE);
130 CREATE_COLUMN (
"fax", CI_FAX);
131 CREATE_COLUMN (
"email", CI_EMAIL);
132 CREATE_COLUMN (
"notes", CI_NOTES);
133 CREATE_COLUMN (
"shipname", CI_SHIPNAME);
134 CREATE_COLUMN (
"shipaddr1", CI_SHIPADDR1);
135 CREATE_COLUMN (
"shipaddr2", CI_SHIPADDR2);
136 CREATE_COLUMN (
"shipaddr3", CI_SHIPADDR3);
137 CREATE_COLUMN (
"shipaddr4", CI_SHIPADDR4);
138 CREATE_COLUMN (
"shipphone", CI_SHIPPHONE);
139 CREATE_COLUMN (
"shipfax", CI_SHIPFAX);
140 CREATE_COLUMN (
"shipemail", CI_SHIPEMAIL);
142 gui->component_id = gnc_register_gui_component (
"dialog-customer_import_gui",
144 gnc_customer_import_gui_close_handler,
148 gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, gui);
149 gtk_widget_show_all ( gui->dialog );
154 gnc_plugin_customer_import_getFilename(
void)
159 GtkFileFilter *filter;
161 filter = gtk_file_filter_new ();
162 gtk_file_filter_set_name (filter,
"comma separated values (*.csv)");
163 gtk_file_filter_add_pattern (filter,
"*.csv");
164 filters = g_list_append( filters, filter );
165 filter = gtk_file_filter_new ();
166 gtk_file_filter_set_name (filter,
"text files (*.txt)");
167 gtk_file_filter_add_pattern (filter,
"*.txt");
168 filters = g_list_append( filters, filter );
169 filename = gnc_file_dialog(_(
"Import Customers from csv"), filters, NULL, GNC_FILE_DIALOG_IMPORT);
175 gnc_customer_import_gui_ok_cb (GtkWidget *widget, gpointer data)
177 CustomerImportGui *gui = data;
178 gchar *filename = g_strdup( gtk_entry_get_text( GTK_ENTRY(gui->entryFilename) ) );
180 customer_import_result res;
181 guint n_fixed, n_deleted, n_customers_created, n_customers_updated;
185 if (g_ascii_strcasecmp (gui->type,
"CUSTOMER") == 0) cv_type_text = _(
"customers");
186 else cv_type_text = _(
"vendors");
188 gtk_list_store_clear (gui->store);
189 res = gnc_customer_import_read_file (filename, gui->regexp->str, gui->store, 0, &stats);
190 if (res == CI_RESULT_OK)
192 gnc_customer_import_fix_customers (gui->store, &n_fixed, &n_deleted, gui->type);
193 gnc_customer_import_create_customers (gui->store, gui->book, &n_customers_created, &n_customers_updated, gui->type);
194 gnc_info_dialog (gui->dialog, _(
"Import results:\n%i lines were ignored\n%i lines imported:\n %u %s fixed\n %u %s ignored (not fixable)\n\n %u %s created\n %u %s updated (based on id)"), \
195 stats.n_ignored, stats.n_imported, n_fixed, cv_type_text, n_deleted, cv_type_text, n_customers_created, cv_type_text, n_customers_updated, cv_type_text);
197 if (stats.n_ignored > 0)
198 gnc_info2_dialog (gui->dialog, _(
"These lines were ignored during import"), stats.ignored_lines->str);
200 g_string_free (stats.ignored_lines, TRUE);
201 gnc_close_gui_component (gui->component_id);
203 else if (res == CI_RESULT_OPEN_FAILED)
205 gnc_error_dialog (gui->dialog, _(
"The input file can not be opened."));
207 else if (res == CI_RESULT_ERROR_IN_REGEXP)
214 gnc_customer_import_gui_cancel_cb (GtkWidget *widget, gpointer data)
216 CustomerImportGui *gui = data;
218 gnc_close_gui_component (gui->component_id);
222 gnc_customer_import_gui_help_cb (GtkWidget *widget, gpointer data)
228 gnc_customer_import_gui_close_handler (gpointer user_data)
230 CustomerImportGui *gui = user_data;
232 gtk_widget_destroy (gui->dialog);
238 gnc_customer_import_gui_destroy_cb (GtkWidget *widget, gpointer data)
240 CustomerImportGui *gui = data;
242 gnc_suspend_gui_refresh ();
243 gnc_unregister_gui_component (gui->component_id);
244 gnc_resume_gui_refresh ();
246 g_object_unref (gui->store);
247 g_string_free (gui->regexp, TRUE);
251 void gnc_customer_import_gui_buttonOpen_cb (GtkWidget *widget, gpointer data)
254 CustomerImportGui *gui = data;
256 filename = gnc_plugin_customer_import_getFilename();
259 gtk_entry_set_text( GTK_ENTRY(gui->entryFilename), filename );
264 void gnc_customer_import_gui_filenameChanged_cb (GtkWidget *widget, gpointer data)
266 CustomerImportGui *gui = data;
267 gchar *filename = g_strdup( gtk_entry_get_text( GTK_ENTRY(gui->entryFilename) ) );
270 gtk_list_store_clear (gui->store);
271 gnc_customer_import_read_file (filename, gui->regexp->str, gui->store, 10, NULL);
276 void gnc_customer_import_gui_option1_cb (GtkWidget *widget, gpointer data)
278 CustomerImportGui *gui = data;
279 if (!gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(widget) ))
281 g_string_assign (gui->regexp,
"^(?<id>[^;]*);(?<company>[^;]*);(?<name>[^;]*);(?<addr1>[^;]*);?(?<addr2>[^;]*);?(?<addr3>[^;]*);?(?<addr4>[^;]*);?(?<phone>[^;]*);?(?<fax>[^;]*);?(?<email>[^;]*);?(?<notes>[^;]*);?(?<shipname>[^;]*);?(?<shipaddr1>[^;]*);?(?<shipaddr2>[^;]*);?(?<shipaddr3>[^;]*);?(?<shipaddr4>[^;]*);?(?<shipphone>[^;]*);(?<shipfax>[^;]*);(?<shipemail>[^;]*)");
282 gnc_customer_import_gui_filenameChanged_cb (gui->entryFilename, gui);
285 void gnc_customer_import_gui_option2_cb (GtkWidget *widget, gpointer data)
287 CustomerImportGui *gui = data;
288 if (!gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(widget) ))
290 g_string_assign (gui->regexp,
"^(?<id>[^,]*),(?<company>[^,]*),(?<name>[^,]*),(?<addr1>[^,]*),?(?<addr2>[^,]*),?(?<addr3>[^,]*),?(?<addr4>[^,]*),?(?<phone>[^,]*),?(?<fax>[^,]*),?(?<email>[^,]*),?(?<notes>[^,]*),?(?<shipname>[^,]*),?(?<shipaddr1>[^,]*),?(?<shipaddr2>[^,]*),?(?<shipaddr3>[^,]*),?(?<shipaddr4>[^,]*),?(?<shipphone>[^,]*),(?<shipfax>[^,]*),(?<shipemail>[^,]*)");
291 gnc_customer_import_gui_filenameChanged_cb (gui->entryFilename, gui);
294 void gnc_customer_import_gui_option3_cb (GtkWidget *widget, gpointer data)
296 CustomerImportGui *gui = data;
297 if (!gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(widget) ))
300 g_string_assign (gui->regexp,
"^((?<id>[^\";]*)|\"(?<id>[^\"]*)\");((?<company>[^\";]*)|\"(?<company>[^\"]*)\");((?<name>[^\";]*)|\"(?<name>[^\"]*)\");((?<addr1>[^\";]*)|\"(?<addr1>[^\"]*)\");((?<addr2>[^\";]*)|\"(?<addr2>[^\"]*)\");((?<addr3>[^\";]*)|\"(?<addr3>[^\"]*)\");((?<addr4>[^\";]*)|\"(?<addr4>[^\"]*)\");((?<phone>[^\";]*)|\"(?<phone>[^\"]*)\");((?<fax>[^\";]*)|\"(?<fax>[^\"]*)\");((?<email>[^\";]*)|\"(?<email>[^\"]*)\");((?<notes>[^\";]*)|\"(?<notes>[^\"]*)\");((?<shipname>[^\";]*)|\"(?<shipname>[^\"]*)\");((?<shipaddr1>[^\";]*)|\"(?<shipaddr1>[^\"]*)\");((?<shipaddr2>[^\";]*)|\"(?<shipaddr2>[^\"]*)\");((?<shipaddr3>[^\";]*)|\"(?<shipaddr3>[^\"]*)\");((?<shipaddr4>[^\";]*)|\"(?<shipaddr4>[^\"]*)\");((?<shipphone>[^\";]*)|\"(?<shipphone>[^\"]*)\");((?<shipfax>[^\";]*)|\"(?<shipfax>[^\"]*)\");((?<shipemail>[^\";]*)|\"(?<shipemail>[^\"]*)\")$");
301 gnc_customer_import_gui_filenameChanged_cb (gui->entryFilename, gui);
304 void gnc_customer_import_gui_option4_cb (GtkWidget *widget, gpointer data)
306 CustomerImportGui *gui = data;
307 if (!gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(widget) ))
310 g_string_assign (gui->regexp,
"^((?<id>[^\",]*)|\"(?<id>[^\"]*)\"),((?<company>[^\",]*)|\"(?<company>[^\"]*)\"),((?<name>[^\",]*)|\"(?<name>[^\"]*)\"),((?<addr1>[^\",]*)|\"(?<addr1>[^\"]*)\"),((?<addr2>[^\",]*)|\"(?<addr2>[^\"]*)\"),((?<addr3>[^\",]*)|\"(?<addr3>[^\"]*)\"),((?<addr4>[^\",]*)|\"(?<addr4>[^\"]*)\"),((?<phone>[^\",]*)|\"(?<phone>[^\"]*)\"),((?<fax>[^\",]*)|\"(?<fax>[^\"]*)\"),((?<email>[^\",]*)|\"(?<email>[^\"]*)\"),((?<notes>[^\",]*)|\"(?<notes>[^\"]*)\"),((?<shipname>[^\",]*)|\"(?<shipname>[^\"]*)\"),((?<shipaddr1>[^\",]*)|\"(?<shipaddr1>[^\"]*)\"),((?<shipaddr2>[^\",]*)|\"(?<shipaddr2>[^\"]*)\"),((?<shipaddr3>[^\",]*)|\"(?<shipaddr3>[^\"]*)\"),((?<shipaddr4>[^\",]*)|\"(?<shipaddr4>[^\"]*)\"),((?<shipphone>[^\",]*)|\"(?<shipphone>[^\"]*)\"),((?<shipfax>[^\",]*)|\"(?<shipfax>[^\"]*)\"),((?<shipemail>[^\",]*)|\"(?<shipemail>[^\"]*)\")$");
311 gnc_customer_import_gui_filenameChanged_cb (gui->entryFilename, gui);
313 void gnc_customer_import_gui_option5_cb (GtkWidget *widget, gpointer data)
315 CustomerImportGui *gui = data;
317 if (!gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(widget) ))
319 temp = gnc_input_dialog (0, _(
"Adjust regular expression used for import"), _(
"This regular expression is used to parse the import file. Modify according to your needs.\n"), gui->regexp->str);
322 g_string_assign (gui->regexp, temp);
324 gnc_customer_import_gui_filenameChanged_cb (gui->entryFilename, gui);
334 void gnc_customer_import_gui_type_cb (GtkWidget *widget, gpointer data)
336 CustomerImportGui *gui = data;
338 if (!gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(widget) ))
340 name = gtk_buildable_get_name(GTK_BUILDABLE(widget));
343 if (g_ascii_strcasecmp(name,
"radiobutton_customer") == 0)gui->type =
"CUSTOMER";
344 else if (g_ascii_strcasecmp(name,
"radiobutton_vendor") == 0)gui->type =
"VENDOR";
367 gnc_input_dialog (GtkWidget *parent,
const gchar *title,
const gchar *msg,
const gchar *default_input)
369 GtkWidget *dialog, *label, *content_area;
372 GtkTextBuffer *buffer;
374 GtkTextIter start, end;
377 dialog = gtk_dialog_new_with_buttons (title, GTK_WINDOW (parent),
378 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
379 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
380 GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
383 content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
385 content_area = GTK_DIALOG (dialog)->vbox;
389 label = gtk_label_new (msg);
390 gtk_container_add (GTK_CONTAINER (content_area), label);
393 view = gtk_text_view_new ();
394 gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (view), GTK_WRAP_WORD_CHAR);
395 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
396 gtk_text_buffer_set_text (buffer, default_input, -1);
397 gtk_container_add (GTK_CONTAINER (content_area), view);
400 gtk_widget_show_all (dialog);
401 result = gtk_dialog_run (GTK_DIALOG (dialog));
403 if (result == GTK_RESPONSE_REJECT)
407 gtk_text_buffer_get_start_iter (buffer, &start);
408 gtk_text_buffer_get_end_iter (buffer, &end);
409 user_input = gtk_text_buffer_get_text (buffer,
410 &start, &end, FALSE);
413 gtk_widget_destroy (dialog);
430 gnc_info2_dialog (GtkWidget *parent,
const gchar *title,
const gchar *msg)
432 GtkWidget *dialog, *scrolledwindow, *content_area;
434 GtkTextBuffer *buffer;
438 dialog = gtk_dialog_new_with_buttons (title, GTK_WINDOW (parent),
439 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
440 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
443 content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
445 content_area = GTK_DIALOG (dialog)->vbox;
449 scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
450 gtk_container_add (GTK_CONTAINER (content_area), scrolledwindow);
453 view = gtk_text_view_new ();
455 gtk_text_view_set_editable (GTK_TEXT_VIEW (view), FALSE);
456 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
457 gtk_text_buffer_set_text (buffer, msg, -1);
458 gtk_container_add (GTK_CONTAINER (scrolledwindow), view);
463 gtk_window_get_size (GTK_WINDOW(parent), &width, &height);
464 gtk_window_set_default_size (GTK_WINDOW(dialog), width, height);
466 gtk_widget_show_all (dialog);
467 gtk_dialog_run (GTK_DIALOG (dialog));
468 gtk_widget_destroy (dialog);
core import functions for customer import plugin
utility functions for the GnuCash UI
GUI handling for customer import plugin.
void gnc_gnome_help(const char *file_name, const char *anchor)