17 #include "../postgis_config.h"
30 #define GUI_RCSID "shp2pgsql-gui $Revision$"
31 #define SHAPEFIELDMAXWIDTH 60
41 #if !GTK_CHECK_VERSION(2, 14, 0)
42 #if !defined(gtk_dialog_get_content_area)
43 #define gtk_dialog_get_content_area(dialog) GTK_DIALOG(dialog)->vbox
209 #define GUIMSG_LINE_MAXLEN 256
239 gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(
textview_log), &iter, 0.0,
TRUE, 0.0, 1.0);
242 while (gtk_events_pending())
243 gtk_main_iteration();
284 GtkWidget *dialog, *label;
287 dialog = gtk_dialog_new_with_buttons(
_(
"Error"), GTK_WINDOW(
window_main),
288 GTK_DIALOG_MODAL & GTK_DIALOG_NO_SEPARATOR & GTK_DIALOG_DESTROY_WITH_PARENT,
289 GTK_STOCK_OK, GTK_RESPONSE_OK, NULL);
290 gtk_dialog_set_has_separator(GTK_DIALOG(dialog),
FALSE );
291 gtk_container_set_border_width(GTK_CONTAINER(dialog), 5);
292 gtk_container_set_border_width(GTK_CONTAINER (GTK_DIALOG(dialog)->vbox), 15);
293 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), label);
294 gtk_widget_show_all(dialog);
295 gtk_dialog_run(GTK_DIALOG(dialog));
296 gtk_widget_destroy(dialog);
306 PGresult *
res = NULL;
307 ExecStatusType status;
312 if ( !
sql )
return 0;
315 status = PQresultStatus(
res);
319 if ( ! ( status == PGRES_COMMAND_OK || status == PGRES_TUPLES_OK ) )
322 if ( status == PGRES_NONFATAL_ERROR )
329 snprintf(sql_trunc, 255,
"%s",
sql);
330 pgui_logf(
"Failed SQL begins: \"%s\"", sql_trunc);
344 PGresult *
res = NULL;
345 ExecStatusType status;
350 if ( !
sql )
return 0;
353 status = PQresultStatus(
res);
357 if ( status != PGRES_COPY_IN )
360 snprintf(sql_trunc, 255,
"%s",
sql);
361 pgui_logf(
"Failed SQL begins: \"%s\"", sql_trunc);
375 char line_trunc[256];
379 if ( ! line )
return 0;
385 snprintf(line_trunc, 255,
"%s", line);
386 pgui_logf(
"Failed row begins: \"%s\"", line_trunc);
408 if ( rollback ) errmsg =
"Roll back the copy.";
440 if (strlen(filename) > max_width)
441 max_width = strlen(filename);
465 char *connection_string = NULL;
466 char *connection_sanitized = NULL;
475 connection_sanitized = strdup(connection_string);
477 pgui_logf(
"Connecting: %s", connection_sanitized);
478 free(connection_sanitized);
484 free(connection_string);
492 free(connection_string);
506 gtk_widget_hide(GTK_WIDGET(widget));
566 if (entry_encoding && strlen(entry_encoding) > 0)
571 config->
encoding = strdup(entry_encoding);
672 PGresult *
result, *geocol_result;
673 GtkTreeIter iter, geocol_iter;
674 GtkListStore *dumper_geocol_combo_list;
675 char *connection_string, *sql_form, *query, *schema, *table, *geocol_query, *geocol_name=NULL;
685 query =
"SELECT tableoids.oid, n.nspname, tableoids.relname, COALESCE((SELECT 1 from pg_attribute WHERE attrelid = tableoids.oid AND atttypid IN (SELECT oid FROM pg_type WHERE typname in ('geometry', 'geography')) LIMIT 1), 0) hasgeo FROM (SELECT c.oid, c.relname, c.relnamespace FROM pg_class c WHERE c.relkind IN ('r', 'v', 'm', 'f','p') AND c.relnamespace IN (SELECT oid FROM pg_namespace WHERE nspname NOT ILIKE 'pg_%' AND nspname <> 'information_schema')) tableoids, pg_namespace n WHERE tableoids.relnamespace = n.oid ORDER BY n.nspname, tableoids.relname";
693 for (i = 0; i < PQntuples(
result); i++)
701 schema = PQgetvalue(
result, i, PQfnumber(
result,
"nspname"));
702 table = PQgetvalue(
result, i, PQfnumber(
result,
"relname"));
704 sql_form =
"SELECT n.nspname, c.relname, a.attname FROM pg_class c, pg_namespace n, pg_attribute a WHERE c.relnamespace = n.oid AND n.nspname = '%s' AND c.relname = '%s' AND a.attrelid = c.oid AND a.atttypid IN (SELECT oid FROM pg_type WHERE typname in ('geometry', 'geography'))";
706 sz = strlen(sql_form) + strlen(schema) + strlen(table) + 1;
707 geocol_query =
malloc(sz);
708 snprintf(geocol_query, sz, sql_form, schema, table);
718 if (PQntuples(geocol_result) > 0)
721 for (j = 0; j < PQntuples(geocol_result); j++)
723 geocol_name = PQgetvalue(geocol_result, j, PQfnumber(geocol_result,
"attname"));
726 gtk_list_store_set(dumper_geocol_combo_list, &geocol_iter,
737 gtk_list_store_set(dumper_geocol_combo_list, &geocol_iter,
743 PQclear(geocol_result);
749 hasgeo = atoi(PQgetvalue(
result, i, PQfnumber(
result,
"hasgeo")));
810 if (keep_fieldname_case)
888 if (response == GTK_RESPONSE_OK)
904 char *table_start, *table_end;
916 if ( loader_file_config->
encoding == NULL )
918 free(loader_file_config);
919 pgui_seterr(
"Unable to allocate memory for encoding");
924 loader_file_config->
shp_file = strdup(filename);
925 if ( loader_file_config->
shp_file == NULL )
928 free(loader_file_config);
929 pgui_seterr(
"Unable to allocate memory for filename");
934 table_start = loader_file_config->
shp_file + strlen(loader_file_config->
shp_file);
935 while (*table_start !=
'/' && *table_start !=
'\\' && table_start > loader_file_config->
shp_file)
942 table_end = loader_file_config->
shp_file + strlen(loader_file_config->
shp_file);
943 while (*table_end !=
'.' && table_end > loader_file_config->
shp_file && table_end > table_start )
947 loader_file_config->
table =
malloc(table_end - table_start + 1);
948 memcpy(loader_file_config->
table, table_start, table_end - table_start);
949 loader_file_config->
table[table_end - table_start] =
'\0';
952 for (i = 0; i < table_end - table_start; i++)
954 if (isupper(loader_file_config->
table[i]) != 0)
955 loader_file_config->
table[i] = tolower(loader_file_config->
table[i]);
959 loader_file_config->
schema = strdup(
"public");
967 return loader_file_config;
1038 gchar *schema, *table, *geocol;
1055 dumper_table_config->
schema = strdup(schema);
1056 dumper_table_config->
table = strdup(table);
1059 dumper_table_config->
shp_file = strdup(table);
1061 if (hasgeo && geocol)
1066 return dumper_table_config;
1075 GtkListStore *geocol_liststore;
1087 if (chooser_liststore)
1090 gtk_tree_model_get(GTK_TREE_MODEL(chooser_liststore), chooser_iter,
1128 switch (dbf_fieldtype)
1132 if (!strcmp(pg_fieldtype,
"varchar"))
1138 if (!strcmp(pg_fieldtype,
"date"))
1144 if (!strcmp(pg_fieldtype,
"int2") || !strcmp(pg_fieldtype,
"int4") || !strcmp(pg_fieldtype,
"numeric"))
1150 if (!strcmp(pg_fieldtype,
"float8") || !strcmp(pg_fieldtype,
"numeric"))
1156 if (!strcmp(pg_fieldtype,
"boolean"))
1170 ExecStatusType status;
1173 char *pg_fieldname, *pg_fieldtype;
1177 status = PQresultStatus(
result);
1178 if (status == PGRES_TUPLES_OK)
1180 ntuples = PQntuples(
result);
1182 switch (config->
opt)
1206 pgui_seterr(
_(
"ERROR: Destination table %s.%s could not be found for appending"), config->
schema, config->
table);
1225 for (j = 0; j < ntuples; j++)
1227 pg_fieldname = PQgetvalue(
result, j, PQfnumber(
result,
"field"));
1228 pg_fieldtype = PQgetvalue(
result, j, PQfnumber(
result,
"type"));
1237 pgui_logf(
_(
"Warning: DBF Field '%s' is not compatible with PostgreSQL column '%s' in %s.%s"), state->
field_names[i], pg_fieldname, config->
schema, config->
table);
1246 pgui_logf(
_(
"Warning: DBF Field '%s' within file %s could not be matched to a column within table %s.%s"),
1260 pgui_seterr(
_(
"ERROR: unable to process validation response from remote server"));
1303 if (response == GTK_RESPONSE_OK)
1316 GSList *filename_list, *filename_item;
1326 filename_list = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(
dialog_filechooser));
1328 filename_item = g_slist_nth(filename_list, 0);
1329 while (filename_item)
1332 filename = g_slist_nth_data(filename_item, 0);
1335 if (loader_file_config == NULL) {
1338 filename_item = g_slist_next(filename_item);
1344 filename_item = g_slist_next(filename_item);
1348 g_slist_free(filename_list);
1358 GtkTreeSelection *chooser_selection;
1359 GtkTreeModel *model;
1360 GList *selected_rows_list, *selected_row;
1362 GtkTreePath *tree_path;
1367 pgui_seterr(
_(
"Unable to connect to the database - please check your connection settings"));
1386 chooser_selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(
chooser_tree));
1388 selected_rows_list = gtk_tree_selection_get_selected_rows(chooser_selection, &model);
1389 selected_row = g_list_first(selected_rows_list);
1390 while (selected_row)
1393 tree_path = (GtkTreePath *)g_list_nth_data(selected_row, 0);
1394 gtk_tree_model_get_iter(model, &iter, tree_path);
1401 selected_row = g_list_next(selected_row);
1405 g_list_foreach(selected_row, (GFunc)gtk_tree_path_free, NULL);
1406 g_list_free(selected_row);
1445 char *sql_form, *query, *connection_string, *progress_shapefile = NULL;
1450 char *header, *footer, *record;
1456 pgui_seterr(
_(
"ERROR: You haven't specified any files to import"));
1466 pgui_seterr(
_(
"Unable to connect to the database - please check your connection settings"));
1483 sql_form =
"SELECT a.attnum, a.attname AS field, t.typname AS type, a.attlen AS length, a.atttypmod AS precision FROM pg_class c, pg_attribute a, pg_type t, pg_namespace n WHERE c.relname = '%s' AND n.nspname = '%s' AND a.attnum > 0 AND a.attrelid = c.oid AND a.atttypid = t.oid AND c.relnamespace = n.oid ORDER BY a.attnum";
1495 sz = strlen(sql_form) + strlen(loader_file_config->
schema) + strlen(loader_file_config->
table) + 1;
1497 snprintf(query, sz, sql_form, loader_file_config->
table, loader_file_config->
schema);
1532 pgui_logf(
"\n==============================");
1533 pgui_logf(
"Importing with configuration: %s, %s, %s, %s, mode=%c, dump=%d, simple=%d, geography=%d, index=%d, shape=%d, srid=%d", loader_file_config->
table, loader_file_config->
schema, loader_file_config->
geo_col, loader_file_config->
shp_file, loader_file_config->
opt, loader_file_config->
dump_format, loader_file_config->
simple_geometries, loader_file_config->
geography, loader_file_config->
createindex, loader_file_config->
readshape, loader_file_config->
sr_id);
1544 gtk_widget_set_sensitive(widget,
FALSE);
1547 while (gtk_events_pending())
1548 gtk_main_iteration();
1560 goto import_cleanup;
1564 for (i = strlen(loader_file_config->
shp_file); i >= 0
1565 && loader_file_config->
shp_file[i - 1] !=
'\\' && loader_file_config->
shp_file[i - 1] !=
'/'; i--);
1567 progress_shapefile =
malloc(strlen(loader_file_config->
shp_file));
1568 strcpy(progress_shapefile, &loader_file_config->
shp_file[i]);
1574 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(
progress), 0.0);
1591 goto import_cleanup;
1600 goto import_cleanup;
1606 int records_per_tick = (numrecords / 200) - 1;
1608 if ( records_per_tick < 1 )
1609 records_per_tick = 1;
1621 goto import_cleanup;
1629 goto import_cleanup;
1633 for (i = 0; i < numrecords &&
is_running; i++)
1648 pgui_logf(
_(
"Import failed on record number %d"), i);
1656 goto import_cleanup;
1670 pgui_logf(
_(
"Import failed on record number %d"), i);
1685 if ( i % records_per_tick == 0 )
1686 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(
progress), (
float)i / numrecords);
1689 while (gtk_events_pending())
1690 gtk_main_iteration();
1697 goto import_cleanup;
1700 if (PQresultStatus(
result) != PGRES_COMMAND_OK)
1704 goto import_cleanup;
1719 goto import_cleanup;
1725 gtk_label_set_text(GTK_LABEL(
label_progress),
_(
"Creating spatial index..."));
1728 while (gtk_events_pending())
1729 gtk_main_iteration();
1737 goto import_cleanup;
1758 if (progress_shapefile)
1759 free(progress_shapefile);
1769 gtk_widget_set_sensitive(widget,
TRUE);
1772 gtk_widget_hide(widget);
1773 gtk_widget_show(widget);
1779 while (gtk_events_pending())
1780 gtk_main_iteration();
1783 free(connection_string);
1796 char *output_shapefile, *orig_shapefile;
1800 int ret, success =
FALSE, i = 0;
1806 pgui_seterr(
_(
"ERROR: You haven't specified any tables to export"));
1816 pgui_seterr(
_(
"Unable to connect to the database - please check your connection settings"));
1846 pgui_logf(
"\n==============================");
1847 pgui_logf(
"Exporting with configuration: %s, %s, %s", dumper_table_config->
table, dumper_table_config->
schema, dumper_table_config->
shp_file);
1854 gtk_widget_set_sensitive(widget,
FALSE);
1857 while (gtk_events_pending())
1858 gtk_main_iteration();
1865 orig_shapefile = dumper_table_config->
shp_file;
1866 output_shapefile =
malloc(strlen(folder_path) + strlen(dumper_table_config->
shp_file) + 2);
1867 strcpy(output_shapefile, folder_path);
1868 strcat(output_shapefile, G_DIR_SEPARATOR_S);
1869 strcat(output_shapefile, dumper_table_config->
shp_file);
1871 dumper_table_config->
shp_file = output_shapefile;
1880 goto export_cleanup;
1885 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(
progress), 0.0);
1900 goto export_cleanup;
1910 while (gtk_events_pending())
1911 gtk_main_iteration();
1930 goto export_cleanup;
1938 while (gtk_events_pending())
1939 gtk_main_iteration();
1967 dumper_table_config->
shp_file = orig_shapefile;
1981 gtk_widget_set_sensitive(widget,
TRUE);
1984 gtk_widget_hide(widget);
1985 gtk_widget_show(widget);
1991 while (gtk_events_pending())
1992 gtk_main_iteration();
2005 char *filename = NULL;
2007 GError *error = NULL;
2015 filename = g_filename_from_uri(uri, &hostname, &error);
2018 if (filename == NULL)
2020 pgui_logf(
_(
"Unable to process filename: %s\n"), error->message);
2021 g_error_free(error);
2027 if (loader_file_config == NULL) {
2044 gchar *schema, *table, *geo_col, *srid;
2055 if (loader_file_config->
schema)
2058 loader_file_config->
schema = strdup(schema);
2061 if (loader_file_config->
table)
2064 loader_file_config->
table = strdup(table);
2067 if (loader_file_config->
geo_col)
2070 loader_file_config->
geo_col = strdup(geo_col);
2073 loader_file_config->
sr_id = atoi(srid);
2089 GtkSelectionData *selection_data,
2090 guint info, guint t, gpointer
data)
2094 if (selection_data->data == NULL)
2096 pgui_logf(
_(
"Unable to process drag data."));
2100 p = (
char*)selection_data->data;
2107 while (g_ascii_isspace(*p))
2111 while (*q && (*q !=
'\n') && (*q !=
'\r'))
2118 while (q > p && g_ascii_isspace(*q))
2127 p = strchr(p,
'\n');
2140 GtkTreeIter *new_iter,
2166 loader_file_config->
opt =
'a';
2174 loader_file_config->
opt =
'd';
2178 loader_file_config->
opt =
'p';
2182 loader_file_config->
opt =
'c';
2214 if (strlen(new_text) == 0)
2218 columnindex = *(gint *)column;
2232 pgui_logf(
"Invalid SRID requiring more than %d digits: %d",
MAXLEN, loader_file_config->
sr_id);
2282 gchar *schema, *table, *geo_col, *filename;
2293 if (dumper_table_config->
schema)
2296 dumper_table_config->
schema = strdup(schema);
2299 if (dumper_table_config->
table)
2302 dumper_table_config->
table = strdup(table);
2314 dumper_table_config->
shp_file = strdup(filename);
2322 GtkTreeIter *new_iter,
2328 GtkListStore *model;
2351 dumper_table_config->
geo_col_name = strdup(geocol_name);
2373 if (strlen(new_text) == 0)
2377 columnindex = *(gint *)column;
2475 text = gtk_entry_get_text(GTK_ENTRY(
entry_pg_db));
2508 for (i = 0; i < strlen(
conn->
port); i++)
2512 pgui_seterr(
_(
"The connection port must be numeric!"));
2524 char *ptr = strstr(connection_string,
"password");
2528 while ( *ptr !=
'\'' && *ptr !=
'\0' )
2562 pgui_seterr(
_(
"Unable to connect to the database - please check your connection settings"));
2581 const char *authors[] =
2583 "Paul Ramsey <pramsey@cleverelephant.ca>",
2584 "Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>",
2585 "Mark Leslie <mark.s.leslie@gmail.com>",
2592 gtk_about_dialog_set_name(GTK_ABOUT_DIALOG(
dialog_about),
_(
"PostGIS Shapefile Import/Export Manager"));
2594 gtk_about_dialog_set_website(GTK_ABOUT_DIALOG(
dialog_about),
"http://postgis.net/");
2595 gtk_about_dialog_set_authors(GTK_ABOUT_DIALOG(
dialog_about), authors);
2601 GtkFileFilter *file_filter_shape;
2605 GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CLOSE, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL);
2608 file_filter_shape = gtk_file_filter_new();
2609 gtk_file_filter_add_pattern(GTK_FILE_FILTER(file_filter_shape),
"*.shp");
2610 gtk_file_filter_set_name(GTK_FILE_FILTER(file_filter_shape),
_(
"Shape Files (*.shp)"));
2611 gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(
dialog_filechooser), file_filter_shape);
2614 file_filter_shape = gtk_file_filter_new();
2615 gtk_file_filter_add_pattern(GTK_FILE_FILTER(file_filter_shape),
"*.dbf");
2616 gtk_file_filter_set_name(GTK_FILE_FILTER(file_filter_shape),
_(
"DBF Files (*.dbf)"));
2617 gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(
dialog_filechooser), file_filter_shape);
2628 GtkFileFilter *file_filter_shape;
2632 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, GTK_STOCK_CANCEL, GTK_RESPONSE_CLOSE, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL);
2635 file_filter_shape = gtk_file_filter_new();
2636 gtk_file_filter_add_pattern(GTK_FILE_FILTER(file_filter_shape),
"*.shp");
2637 gtk_file_filter_set_name(GTK_FILE_FILTER(file_filter_shape),
_(
"Shape Files (*.shp)"));
2641 file_filter_shape = gtk_file_filter_new();
2642 gtk_file_filter_add_pattern(GTK_FILE_FILTER(file_filter_shape),
"*.dbf");
2643 gtk_file_filter_set_name(GTK_FILE_FILTER(file_filter_shape),
_(
"DBF Files (*.dbf)"));
2652 GtkWidget *vbox_progress, *table_progress;
2654 dialog_progress = gtk_dialog_new_with_buttons(
_(
"Working..."), GTK_WINDOW(
window_main), GTK_DIALOG_DESTROY_WITH_PARENT,
"_Cancel", GTK_RESPONSE_CANCEL, NULL);
2662 gtk_box_set_spacing(GTK_BOX(vbox_progress), 15);
2665 table_progress = gtk_table_new(2, 1,
TRUE);
2666 gtk_container_set_border_width (GTK_CONTAINER (table_progress), 12);
2667 gtk_table_set_row_spacings(GTK_TABLE(table_progress), 5);
2668 gtk_table_set_col_spacings(GTK_TABLE(table_progress), 10);
2672 gtk_table_attach_defaults(GTK_TABLE(table_progress),
label_progress, 0, 1, 0, 1);
2676 gtk_progress_bar_set_orientation(GTK_PROGRESS_BAR(
progress), GTK_PROGRESS_LEFT_TO_RIGHT);
2677 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(
progress), 0.0);
2678 gtk_table_attach_defaults(GTK_TABLE(table_progress),
progress, 0, 1, 1, 2);
2681 gtk_box_pack_start(GTK_BOX(vbox_progress), table_progress,
FALSE,
FALSE, 0);
2695 GtkWidget *align = gtk_alignment_new(alignment, 0.5, 0.0, 1.0);
2696 GtkWidget *label = gtk_label_new(
str);
2697 gtk_table_attach_defaults(GTK_TABLE(table), align, 1, 3, row, row + 1);
2698 gtk_container_add(GTK_CONTAINER (align), label);
2704 GtkWidget *table_options;
2705 GtkWidget *align_options_center;
2706 static int text_width = 12;
2708 dialog_loader_options = gtk_dialog_new_with_buttons(
_(
"Import Options"), GTK_WINDOW(
window_main), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL);
2714 table_options = gtk_table_new(7, 3,
TRUE);
2715 gtk_container_set_border_width (GTK_CONTAINER (table_options), 12);
2716 gtk_table_set_row_spacings(GTK_TABLE(table_options), 5);
2717 gtk_table_set_col_spacings(GTK_TABLE(table_options), 10);
2726 align_options_center = gtk_alignment_new( 0.5, 0.5, 0.0, 1.0 );
2727 gtk_table_attach_defaults(GTK_TABLE(table_options), align_options_center, 0, 1, 1, 2 );
2732 align_options_center = gtk_alignment_new( 0.5, 0.5, 0.0, 1.0 );
2733 gtk_table_attach_defaults(GTK_TABLE(table_options), align_options_center, 0, 1, 2, 3 );
2738 align_options_center = gtk_alignment_new( 0.5, 0.5, 0.0, 1.0 );
2739 gtk_table_attach_defaults(GTK_TABLE(table_options), align_options_center, 0, 1, 3, 4 );
2744 align_options_center = gtk_alignment_new( 0.5, 0.5, 0.0, 1.0 );
2745 gtk_table_attach_defaults(GTK_TABLE(table_options), align_options_center, 0, 1, 4, 5 );
2750 align_options_center = gtk_alignment_new( 0.5, 0.5, 0.0, 0.0 );
2751 gtk_table_attach_defaults(GTK_TABLE(table_options), align_options_center, 0, 1, 5, 6 );
2756 align_options_center = gtk_alignment_new( 0.5, 0.5, 0.0, 1.0 );
2757 gtk_table_attach_defaults(GTK_TABLE(table_options), align_options_center, 0, 1, 6, 7 );
2762 align_options_center = gtk_alignment_new( 0.5, 0.5, 0.0, 1.0 );
2763 gtk_table_attach_defaults(GTK_TABLE(table_options), align_options_center, 0, 1, 7, 8 );
2777 GtkWidget *table_options;
2778 GtkWidget *align_options_center;
2780 dialog_dumper_options = gtk_dialog_new_with_buttons(
_(
"Export Options"), GTK_WINDOW(
window_main), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL);
2786 table_options = gtk_table_new(3, 3,
TRUE);
2787 gtk_container_set_border_width (GTK_CONTAINER (table_options), 12);
2788 gtk_table_set_row_spacings(GTK_TABLE(table_options), 5);
2789 gtk_table_set_col_spacings(GTK_TABLE(table_options), 10);
2793 align_options_center = gtk_alignment_new( 0.5, 0.5, 0.0, 1.0 );
2794 gtk_table_attach_defaults(GTK_TABLE(table_options), align_options_center, 0, 1, 0, 1 );
2799 align_options_center = gtk_alignment_new( 0.5, 0.5, 0.0, 1.0 );
2800 gtk_table_attach_defaults(GTK_TABLE(table_options), align_options_center, 0, 1, 1, 2 );
2805 align_options_center = gtk_alignment_new( 0.5, 0.5, 0.0, 1.0 );
2806 gtk_table_attach_defaults(GTK_TABLE(table_options), align_options_center, 0, 1, 2, 3 );
2824 GtkWidget *vbox_tree, *table_progress;
2825 GtkWidget *sw, *label;
2826 GtkTreeSelection *chooser_selection;
2830 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL);
2841 GTK_TYPE_TREE_MODEL,
2853 chooser_selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(
chooser_tree));
2854 gtk_tree_selection_set_mode(chooser_selection, GTK_SELECTION_MULTIPLE);
2857 sw = gtk_scrolled_window_new(NULL, NULL);
2858 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
2859 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_ETCHED_IN);
2860 gtk_widget_set_size_request(sw, 320, 240);
2862 gtk_box_pack_start(GTK_BOX(vbox_tree), sw,
FALSE,
FALSE, 10);
2890 table_progress = gtk_table_new(1, 2,
FALSE);
2891 gtk_container_set_border_width (GTK_CONTAINER (table_progress), 0);
2892 gtk_table_set_row_spacings(GTK_TABLE(table_progress), 0);
2893 gtk_table_set_col_spacings(GTK_TABLE(table_progress), 0);
2897 label = gtk_label_new(
_(
"Only show tables with geo columns"));
2898 gtk_table_attach(GTK_TABLE(table_progress), label, 1, 2, 0, 1, GTK_FILL, GTK_FILL, 5, 0);
2903 gtk_box_pack_start(GTK_BOX(vbox_tree), table_progress,
FALSE,
FALSE, 10);
2916 GtkWidget *vbox_tree;
2919 gint *column_indexes;
2921 gtk_container_set_border_width (GTK_CONTAINER (import_list_frame), 0);
2923 vbox_tree = gtk_vbox_new(
FALSE, 15);
2924 gtk_container_set_border_width(GTK_CONTAINER(vbox_tree), 5);
2925 gtk_container_add(GTK_CONTAINER(import_list_frame), vbox_tree);
2949 sw = gtk_scrolled_window_new(NULL, NULL);
2950 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
2951 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_ETCHED_IN);
2952 gtk_widget_set_size_request(sw, -1, 150);
2954 gtk_box_pack_start(GTK_BOX(vbox_tree), sw,
TRUE,
TRUE, 0);
2955 gtk_container_add(GTK_CONTAINER (sw),
import_tree);
3086 GtkTargetEntry drop_types[] =
3088 {
"text/uri-list", 0, 0}
3091 gint n_drop_types =
sizeof(drop_types)/
sizeof(drop_types[0]);
3093 GTK_DEST_DEFAULT_ALL,
3094 drop_types, n_drop_types,
3096 g_signal_connect(G_OBJECT(
import_tree),
"drag_data_received",
3107 GtkWidget *vbox_tree;
3109 gint *column_indexes;
3111 gtk_container_set_border_width (GTK_CONTAINER (export_list_frame), 0);
3113 vbox_tree = gtk_vbox_new(
FALSE, 15);
3114 gtk_container_set_border_width(GTK_CONTAINER(vbox_tree), 5);
3115 gtk_container_add(GTK_CONTAINER(export_list_frame), vbox_tree);
3123 GTK_TYPE_TREE_MODEL,
3138 sw = gtk_scrolled_window_new(NULL, NULL);
3139 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
3140 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_ETCHED_IN);
3141 gtk_widget_set_size_request(sw, -1, 150);
3143 gtk_box_pack_start(GTK_BOX(vbox_tree), sw,
TRUE,
TRUE, 0);
3144 gtk_container_add(GTK_CONTAINER (sw),
export_tree);
3226 static int text_width = 12;
3235 GtkWidget *frame_pg, *table_pg;
3238 GtkWidget *button_okay;
3241 window_conn = gtk_window_new(GTK_WINDOW_TOPLEVEL);
3242 gtk_container_set_border_width(GTK_CONTAINER(
window_conn), 10);
3243 gtk_window_set_title(GTK_WINDOW(
window_conn),
_(
"PostGIS connection"));
3244 gtk_window_set_position(GTK_WINDOW(
window_conn), GTK_WIN_POS_CENTER);
3248 vbox = gtk_vbox_new(
FALSE, 15);
3253 frame_pg = gtk_frame_new(
_(
"PostGIS Connection"));
3254 table_pg = gtk_table_new(5, 3,
TRUE);
3255 gtk_container_set_border_width (GTK_CONTAINER (table_pg), 8);
3256 gtk_table_set_col_spacings(GTK_TABLE(table_pg), 7);
3257 gtk_table_set_row_spacings(GTK_TABLE(table_pg), 3);
3260 label = gtk_label_new(
_(
"Username:"));
3262 gtk_table_attach_defaults(GTK_TABLE(table_pg), label, 0, 1, 0, 1 );
3263 gtk_table_attach_defaults(GTK_TABLE(table_pg),
entry_pg_user, 1, 3, 0, 1 );
3266 label = gtk_label_new(
_(
"Password:"));
3269 gtk_table_attach_defaults(GTK_TABLE(table_pg), label, 0, 1, 1, 2 );
3270 gtk_table_attach_defaults(GTK_TABLE(table_pg),
entry_pg_pass, 1, 3, 1, 2 );
3273 label = gtk_label_new(
_(
"Server Host:"));
3275 gtk_entry_set_width_chars(GTK_ENTRY(
entry_pg_host), text_width);
3276 gtk_table_attach_defaults(GTK_TABLE(table_pg), label, 0, 1, 2, 3 );
3277 gtk_table_attach_defaults(GTK_TABLE(table_pg),
entry_pg_host, 1, 2, 2, 3 );
3281 gtk_table_attach_defaults(GTK_TABLE(table_pg),
entry_pg_port, 2, 3, 2, 3 );
3284 label = gtk_label_new(
_(
"Database:"));
3286 gtk_table_attach_defaults(GTK_TABLE(table_pg), label, 0, 1, 3, 4 );
3287 gtk_table_attach_defaults(GTK_TABLE(table_pg),
entry_pg_db, 1, 3, 3, 4 );
3290 gtk_container_add(GTK_CONTAINER(frame_pg), table_pg);
3293 gtk_container_add(GTK_CONTAINER(
window_conn), vbox);
3296 gtk_container_add(GTK_CONTAINER(vbox), frame_pg);
3299 button_okay = gtk_button_new_with_label(
_(
"OK"));
3300 gtk_container_add(GTK_CONTAINER(vbox), button_okay);
3313 GtkWidget *vbox_main, *vbox_loader, *vbox_dumper;
3316 GtkWidget *frame_pg, *import_list_frame, *export_list_frame, *frame_log;
3317 GtkWidget *button_pg_conn;
3320 GtkWidget *notebook;
3323 GtkWidget *loader_hbox_buttons, *loader_button_options, *loader_button_import, *loader_button_cancel, *loader_button_about;
3324 GtkWidget *dumper_hbox_buttons, *dumper_button_options, *dumper_button_export, *dumper_button_cancel, *dumper_button_about;
3327 GtkWidget *scrolledwindow_log;
3330 window_main = gtk_window_new(GTK_WINDOW_TOPLEVEL);
3331 gtk_container_set_border_width(GTK_CONTAINER(
window_main), 10);
3332 gtk_window_set_title(GTK_WINDOW(
window_main),
_(
"PostGIS Shapefile Import/Export Manager"));
3333 gtk_window_set_position(GTK_WINDOW(
window_main), GTK_WIN_POS_CENTER_ALWAYS);
3337 gtk_window_set_default_size(GTK_WINDOW(
window_main), 180, 500);
3346 frame_pg = gtk_frame_new(
_(
"PostGIS Connection"));
3349 button_pg_conn = gtk_button_new_with_label(
_(
"View connection details..."));
3351 gtk_container_set_border_width(GTK_CONTAINER(button_pg_conn), 10);
3352 gtk_container_add(GTK_CONTAINER(frame_pg), button_pg_conn);
3357 notebook = gtk_notebook_new();
3362 import_list_frame = gtk_frame_new(
_(
"Import List"));
3368 loader_hbox_buttons = gtk_hbox_new(
TRUE, 15);
3369 gtk_container_set_border_width (GTK_CONTAINER (loader_hbox_buttons), 0);
3372 loader_button_options = gtk_button_new_with_label(
_(
"Options..."));
3373 loader_button_import = gtk_button_new_with_label(
_(
"Import"));
3374 loader_button_cancel = gtk_button_new_with_label(
_(
"Cancel"));
3375 loader_button_about = gtk_button_new_with_label(
_(
"About"));
3378 g_signal_connect (G_OBJECT (loader_button_import),
"clicked", G_CALLBACK (
pgui_action_import), NULL);
3380 g_signal_connect (G_OBJECT (loader_button_cancel),
"clicked", G_CALLBACK (
pgui_action_cancel), NULL);
3384 gtk_box_pack_start(GTK_BOX(loader_hbox_buttons), loader_button_options,
TRUE,
TRUE, 0);
3385 gtk_box_pack_end(GTK_BOX(loader_hbox_buttons), loader_button_cancel,
TRUE,
TRUE, 0);
3386 gtk_box_pack_end(GTK_BOX(loader_hbox_buttons), loader_button_about,
TRUE,
TRUE, 0);
3387 gtk_box_pack_end(GTK_BOX(loader_hbox_buttons), loader_button_import,
TRUE,
TRUE, 0);
3392 export_list_frame = gtk_frame_new(
_(
"Export List"));
3398 dumper_hbox_buttons = gtk_hbox_new(
TRUE, 15);
3399 gtk_container_set_border_width (GTK_CONTAINER (dumper_hbox_buttons), 0);
3402 dumper_button_options = gtk_button_new_with_label(
_(
"Options..."));
3403 dumper_button_export = gtk_button_new_with_label(
_(
"Export"));
3404 dumper_button_cancel = gtk_button_new_with_label(
_(
"Cancel"));
3405 dumper_button_about = gtk_button_new_with_label(
_(
"About"));
3408 g_signal_connect (G_OBJECT (dumper_button_export),
"clicked", G_CALLBACK (
pgui_action_export), NULL);
3410 g_signal_connect (G_OBJECT (dumper_button_cancel),
"clicked", G_CALLBACK (
pgui_action_cancel), NULL);
3414 gtk_box_pack_start(GTK_BOX(dumper_hbox_buttons), dumper_button_options,
TRUE,
TRUE, 0);
3415 gtk_box_pack_end(GTK_BOX(dumper_hbox_buttons), dumper_button_cancel,
TRUE,
TRUE, 0);
3416 gtk_box_pack_end(GTK_BOX(dumper_hbox_buttons), dumper_button_about,
TRUE,
TRUE, 0);
3417 gtk_box_pack_end(GTK_BOX(dumper_hbox_buttons), dumper_button_export,
TRUE,
TRUE, 0);
3422 frame_log = gtk_frame_new(
_(
"Log Window"));
3423 gtk_container_set_border_width (GTK_CONTAINER (frame_log), 0);
3424 gtk_widget_set_size_request(frame_log, -1, 200);
3427 scrolledwindow_log = gtk_scrolled_window_new(NULL, NULL);
3428 gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW(scrolledwindow_log), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
3430 gtk_container_set_border_width (GTK_CONTAINER (
textview_log), 5);
3433 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(
textview_log), GTK_WRAP_WORD);
3434 gtk_container_add (GTK_CONTAINER (scrolledwindow_log),
textview_log);
3435 gtk_container_add (GTK_CONTAINER (frame_log), scrolledwindow_log);
3440 vbox_main = gtk_vbox_new(
FALSE, 10);
3441 gtk_container_set_border_width (GTK_CONTAINER (vbox_main), 0);
3444 vbox_loader = gtk_vbox_new(
FALSE, 10);
3445 gtk_container_set_border_width(GTK_CONTAINER(vbox_loader), 10);
3447 gtk_box_pack_start(GTK_BOX(vbox_loader), import_list_frame,
FALSE,
TRUE, 0);
3448 gtk_box_pack_start(GTK_BOX(vbox_loader), loader_hbox_buttons,
FALSE,
FALSE, 0);
3449 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox_loader, gtk_label_new(
_(
"Import")));
3452 vbox_dumper = gtk_vbox_new(
FALSE, 10);
3453 gtk_container_set_border_width(GTK_CONTAINER(vbox_dumper), 10);
3455 gtk_box_pack_start(GTK_BOX(vbox_dumper), export_list_frame,
FALSE,
TRUE, 0);
3456 gtk_box_pack_start(GTK_BOX(vbox_dumper), dumper_hbox_buttons,
FALSE,
FALSE, 0);
3457 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox_dumper, gtk_label_new(
_(
"Export")));
3460 gtk_box_pack_start(GTK_BOX(vbox_main), frame_pg,
FALSE,
TRUE, 0);
3461 gtk_box_pack_start(GTK_BOX(vbox_main), notebook,
FALSE,
TRUE, 0);
3462 gtk_box_pack_start(GTK_BOX(vbox_main), frame_log,
TRUE,
TRUE, 0);
3465 gtk_container_add(GTK_CONTAINER(
window_main), vbox_main);
3476 printf(
"RCSID: %s RELEASE: %s\n",
S2P_RCSID, POSTGIS_VERSION);
3477 printf(
"USAGE: shp2pgsql-gui [options]\n");
3478 printf(
"OPTIONS:\n");
3479 printf(
" -U <username>\n");
3480 printf(
" -W <password>\n");
3481 printf(
" -h <host>\n");
3482 printf(
" -p <port>\n");
3483 printf(
" -d <database>\n");
3484 printf(
" -? Display this help screen\n");
3493 setlocale (LC_ALL,
"");
3494 bindtextdomain (PACKAGE, PGSQL_LOCALEDIR);
3495 textdomain (PACKAGE);
3516 while ((c =
pgis_getopt(argc, argv,
"U:p:W:d:h:")) != -1)
3544 gtk_init(&argc, &argv);
char result[OUT_DOUBLE_BUFFER_SIZE]
int pgis_getopt(int argc, char **argv, char *opts)
void set_dumper_config_defaults(SHPDUMPERCONFIG *config)
int ShpDumperGetRecordCount(SHPDUMPERSTATE *state)
void ShpDumperDestroy(SHPDUMPERSTATE *state)
char * shapetypename(int num)
SHPDUMPERSTATE * ShpDumperCreate(SHPDUMPERCONFIG *config)
int ShpDumperConnectDatabase(SHPDUMPERSTATE *state)
int ShpLoaderGenerateShapeRow(SHPDUMPERSTATE *state)
int ShpDumperCloseTable(SHPDUMPERSTATE *state)
int ShpDumperOpenTable(SHPDUMPERSTATE *state)
char * ShpDumperGetConnectionStringFromConn(SHPCONNECTIONCONFIG *conn)
const char SHPAPI_CALL1 * SHPTypeName(int nSHPType);const char SHPAPI_CALL1(*) SHPPartTypeName(int nPartType
int ShpLoaderGetRecordCount(SHPLOADERSTATE *state)
void ShpLoaderDestroy(SHPLOADERSTATE *state)
int ShpLoaderGetSQLCopyStatement(SHPLOADERSTATE *state, char **strheader)
int ShpLoaderOpenShape(SHPLOADERSTATE *state)
int ShpLoaderGenerateSQLRowStatement(SHPLOADERSTATE *state, int item, char **strrecord)
void set_loader_config_defaults(SHPLOADERCONFIG *config)
int ShpLoaderGetSQLFooter(SHPLOADERSTATE *state, char **strfooter)
SHPLOADERSTATE * ShpLoaderCreate(SHPLOADERCONFIG *config)
int ShpLoaderGetSQLHeader(SHPLOADERSTATE *state, char **strheader)
#define GEOGRAPHY_DEFAULT
#define SHPLOADERRECISNULL
#define SHPLOADERRECDELETED
static GtkWidget * label_progress
GtkCellRenderer * export_schema_renderer
@ LOADER_MODE_COMBO_COLUMNS
@ LOADER_MODE_COMBO_OPTION_CHAR
static GtkWidget * add_table_button
static GtkWidget * checkbutton_loader_options_dumpformat
static void pgui_action_connection_details(GtkWidget *widget, gpointer data)
int main(int argc, char *argv[])
GtkCellRenderer * chooser_schema_renderer
static GtkTextBuffer * textbuffer_log
GtkCellRenderer * import_table_renderer
static void update_filename_field_width(void)
static void update_options_ui_from_loader_config_globals(void)
GtkCellRenderer * import_remove_renderer
static SHPLOADERCONFIG * create_new_file_config(const char *filename)
static void pgui_set_dumper_configs_from_options_ui()
static void pgui_set_loader_configs_from_options_ui()
static void update_dumper_config_globals_from_options_ui(SHPDUMPERCONFIG *config)
static void pgui_create_filechooser_dialog(void)
static GtkWidget * add_file_button
GtkTreeViewColumn * export_remove_column
static GtkWidget * entry_pg_port
static GtkWidget * progress
static void pgui_create_progress_dialog(void)
static GtkWidget * checkbutton_loader_options_simplegeoms
static void static void static void static void pgui_seterr(const char *fmt,...) __attribute__((format(printf
GtkTreeViewColumn * import_table_column
static void pgui_action_handle_file_remove(GtkCellRendererToggle *renderer, gchar *path, gpointer user_data)
static void pgui_log_va(const char *fmt, va_list ap) __attribute__((format(printf
static gint pgui_event_popup_delete(GtkWidget *widget, GdkEvent *event, gpointer data)
static int pgui_copy_write(const char *line)
static GtkWidget * checkbutton_loader_options_forceint
static int validate_shape_column_against_pg_column(int dbf_fieldtype, char *pg_fieldtype)
static GtkWidget * dialog_tablechooser
static void update_options_ui_from_dumper_config_globals(void)
@ TABLECHOOSER_HASGEO_COLUMN
@ TABLECHOOSER_TABLE_COLUMN
@ TABLECHOOSER_SCHEMA_COLUMN
@ TABLECHOOSER_GEO_LISTSTORE_COLUMN
@ TABLECHOOSER_GEO_COLUMN
GtkCellRenderer * export_geom_column_renderer
static volatile int is_running
static void update_table_chooser_from_database()
static GtkWidget * entry_pg_host
static int validate_remote_loader_columns(SHPLOADERCONFIG *config, PGresult *result)
static SHPDUMPERCONFIG * create_new_table_config(GtkTreeIter *iter)
static GtkWidget * dialog_dumper_options
static void update_loader_config_globals_from_options_ui(SHPLOADERCONFIG *config)
GtkTreeViewColumn * chooser_schema_column
static void update_dumper_table_config_from_listview_iter(GtkTreeIter *iter, SHPDUMPERCONFIG *dumper_table_config)
static void pgui_action_import(GtkWidget *widget, gpointer data)
static void pgui_action_export(GtkWidget *widget, gpointer data)
static GtkWidget * dialog_filechooser
static int pgui_copy_end(const int rollback)
static void pgui_action_handle_table_remove(GtkCellRendererToggle *renderer, gchar *path, gpointer user_data)
static GtkWidget * checkbutton_loader_options_autoindex
GtkListStore * chooser_table_list_store
static void static void static void pgui_logf(const char *fmt,...) __attribute__((format(printf
static void pgui_create_export_table_table(GtkWidget *export_list_frame)
static GtkWidget * entry_pg_user
static void pgui_create_loader_options_dialog()
GtkCellRenderer * import_schema_renderer
static GtkWidget * checkbutton_loader_options_dbfonly
static PGconn * pg_connection
static GtkWidget * textview_log
GtkTreeViewColumn * export_table_column
static void pgui_create_folderchooser_dialog(void)
GtkTreeViewColumn * export_schema_column
GtkTreeViewColumn * import_srid_column
static void pgui_raise_error_dialogue(void)
static GtkWidget * entry_pg_db
static void update_loader_file_config_from_listview_iter(GtkTreeIter *iter, SHPLOADERCONFIG *loader_file_config)
static void pgui_action_dumper_options_close(GtkWidget *widget, gint response, gpointer data)
static void pgui_action_handle_tree_combo(GtkCellRendererCombo *combo, gchar *path_string, GtkTreeIter *new_iter, gpointer user_data)
static GtkWidget * checkbutton_dumper_options_keep_fieldname_case
static void pgui_action_about_open()
static void static void static void static void static void update_conn_ui_from_conn_config(void)
GtkListStore * chooser_filtered_table_list_store
static int pgui_copy_start(const char *sql)
static GtkWidget * dialog_progress
static void pgui_action_handle_dumper_edit(GtkCellRendererText *renderer, gchar *path, gchar *new_text, gpointer column)
static void pgui_action_handle_table_geocol_combo(GtkCellRendererCombo *combo, gchar *path_string, GtkTreeIter *new_iter, gpointer user_data)
GtkCellRenderer * export_filename_renderer
#define gtk_dialog_get_content_area(dialog)
static void free_loader_config(SHPLOADERCONFIG *config)
static void static void pgui_seterr_va(const char *fmt, va_list ap) __attribute__((format(printf
static int pgui_validate_connection()
static GtkWidget * entry_pg_pass
static void pgui_action_progress_cancel(GtkDialog *dialog, gint response_id, gpointer user_data)
static void process_single_uri(char *uri)
#define SHAPEFIELDMAXWIDTH
GtkWidget * loader_mode_combo
static void pgui_action_handle_file_drop(GtkWidget *widget, GdkDragContext *dc, gint x, gint y, GtkSelectionData *selection_data, guint info, guint t, gpointer data)
GtkTreeViewColumn * import_remove_column
static void pgui_create_options_dialog_add_label(GtkWidget *table, const char *str, gfloat alignment, int row)
static GtkWidget * checkbutton_chooser_geoonly
static void add_loader_file_config_to_list(SHPLOADERCONFIG *loader_file_config)
GtkTreeViewColumn * export_geom_column
static void add_dumper_table_config_to_list(SHPDUMPERCONFIG *dumper_table_config, GtkListStore *chooser_liststore, GtkTreeIter *chooser_iter)
static void pgui_action_loader_options_open(GtkWidget *widget, gpointer data)
static int valid_connection
static void pgui_sanitize_connection_string(char *connection_string)
static int connection_test(void)
GtkListStore * export_table_list_store
GtkCellRenderer * chooser_table_renderer
static void pgui_action_open_file_dialog(GtkWidget *widget, gpointer data)
GtkTreeViewColumn * import_schema_column
static GtkWidget * dialog_about
static gint pgui_action_progress_delete(GtkWidget *widget, GdkEvent *event, gpointer data)
static void pgui_quit(GtkWidget *widget, gpointer data)
GtkListStore * import_file_list_store
static gboolean table_chooser_visibility_func(GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
static void pgui_create_connection_window()
static GtkWidget * checkbutton_loader_options_preservecase
@ EXPORT_GEOMETRY_LISTSTORE_COLUMN
static void pgui_action_loader_options_close(GtkWidget *widget, gint response, gpointer data)
static GtkWidget * entry_options_encoding
#define GUIMSG_LINE_MAXLEN
@ TABLECHOOSER_GEOCOL_COMBO_TEXT
@ TABLECHOOSER_GEOCOL_COMBO_COLUMNS
static void free_dumper_config(SHPDUMPERCONFIG *config)
static GtkWidget * dialog_folderchooser
static void pgui_action_dumper_options_open(GtkWidget *widget, gpointer data)
static void pgui_action_handle_loader_edit(GtkCellRendererText *renderer, gchar *path, gchar *new_text, gpointer column)
GtkTreeViewColumn * import_filename_column
static GtkWidget * window_main
static GtkWidget * checkbutton_dumper_options_unescapedattrs
static int pgui_exec(const char *sql)
GtkTreeViewColumn * chooser_table_column
GtkListStore * loader_mode_combo_list
static void pgui_action_open_table_dialog(GtkWidget *widget, gpointer data)
static GtkWidget * dialog_loader_options
GtkCellRenderer * import_srid_renderer
GtkCellRenderer * import_mode_renderer
static void update_conn_config_from_conn_ui(void)
static SHPCONNECTIONCONFIG * conn
GtkWidget * export_geom_column_combo
static void pgui_action_chooser_toggle_show_geocolumn(GtkToggleButton *togglebutton, gpointer user_data)
GtkCellRenderer * import_filename_renderer
static void pgui_create_main_window(const SHPCONNECTIONCONFIG *conn)
GtkCellRenderer * export_remove_renderer
static void pgui_action_cancel(GtkWidget *widget, gpointer data)
static GtkWidget * window_conn
static void pgui_action_connection_okay(GtkWidget *widget, gpointer data)
GtkCellRenderer * export_table_renderer
static void pgui_create_import_file_table(GtkWidget *import_list_frame)
static SHPLOADERCONFIG * global_loader_config
static SHPDUMPERCONFIG * global_dumper_config
static GtkWidget * checkbutton_loader_options_geography
static char pgui_errmsg[GUIMSG_LINE_MAXLEN+1]
GtkCellRenderer * import_geom_column_renderer
GtkTreeViewColumn * export_filename_column
GtkTreeViewColumn * import_geom_column
static void pgui_create_dumper_options_dialog()
static void pgui_create_about_dialog(void)
GtkTreeViewColumn * import_mode_column
static GtkWidget * checkbutton_dumper_options_includegid
static void pgui_create_tablechooser_dialog()
#define POSTGIS_LIB_VERSION
SHPCONNECTIONCONFIG * conn
char message[SHPDUMPERMSGLEN]
char message[SHPLOADERMSGLEN]