Index: src/poi.c =================================================================== --- src/poi.c (revision 16) +++ src/poi.c (revision 17) @@ -1211,21 +1211,14 @@ poi_dialog(GtkWidget *parent, PoiInfo *poi, gboolean is_add_dialog) { static int last_deg_format = 0; + static gboolean last_is_add = FALSE; + static GtkWidget *dialog = NULL; + static GtkWidget *txt_label; + static GtkWidget *txt_lon, *txt_lat; + static GtkTextBuffer *desc_txt; + static GtkWidget *cmb_category; GtkTreeIter iter; - GtkWidget *dialog; - GtkWidget *table; - GtkWidget *label; - GtkWidget *txt_label; - GtkWidget *txt_lat; - GtkWidget *txt_lon; - GtkWidget *cmb_category; - GtkWidget *txt_desc; - GtkWidget *btn_delete; - GtkWidget *btn_catedit; - GtkWidget *hbox; - GtkWidget *txt_scroll; - GtkTextBuffer *desc_txt; - GtkTextIter begin, end; + DeletePOI dpoi; PoiCategoryEditInfo pcedit; gint cols = (DEG_FORMAT_ENUM_TEXT[_degformat].field_2_in_use) ? 6 : 4; @@ -1240,97 +1233,121 @@ { last_deg_format = _degformat; _degformat = fallback_deg_format; + if(dialog) gtk_widget_destroy(dialog); + dialog = NULL; } else if(_degformat != last_deg_format) + { last_deg_format = _degformat; - - dialog = gtk_dialog_new_with_buttons(_("Add POI"), - GTK_WINDOW(parent), GTK_DIALOG_MODAL, - GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, - NULL); - - if (!is_add_dialog) + if(dialog) gtk_widget_destroy(dialog); + dialog = NULL; + } + if(is_add_dialog != last_is_add) { - gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area), - btn_delete = gtk_button_new_with_label(_("Delete..."))); - g_signal_connect(G_OBJECT(btn_delete), "clicked", - G_CALLBACK(poi_delete), &dpoi); + if(dialog) gtk_widget_destroy(dialog); + dialog = NULL; + last_is_add = is_add_dialog; } - gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area), - btn_catedit = gtk_button_new_with_label(_("Edit Cats..."))); - g_signal_connect(G_OBJECT(btn_catedit), "clicked", - G_CALLBACK(poi_edit_cat), &pcedit); + /* create dialog */ + if(!dialog) + { + GtkWidget *table; + GtkWidget *label; + GtkWidget *txt_desc; + GtkWidget *btn_delete; + GtkWidget *btn_catedit; + GtkWidget *hbox; + GtkWidget *txt_scroll; - gtk_dialog_add_button(GTK_DIALOG(dialog), - GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT); + dialog = gtk_dialog_new_with_buttons( + is_add_dialog ? _("Add POI") : _("Edit POI"), + GTK_WINDOW(parent), GTK_DIALOG_MODAL, + GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, + NULL); + if (!is_add_dialog) + { + gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area), + btn_delete = gtk_button_new_with_label(_("Delete..."))); + g_signal_connect(G_OBJECT(btn_delete), "clicked", + G_CALLBACK(poi_delete), &dpoi); + } - /* Set the lat/lon strings. */ - gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), - table = gtk_table_new(6, cols, FALSE), TRUE, TRUE, 0); + gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area), + btn_catedit = gtk_button_new_with_label(_("Edit Cats..."))); + g_signal_connect(G_OBJECT(btn_catedit), "clicked", + G_CALLBACK(poi_edit_cat), &pcedit); - gtk_table_attach(GTK_TABLE(table), - label = gtk_label_new(DEG_FORMAT_ENUM_TEXT[_degformat] - .short_field_1), - 0, 1, 0, 1, GTK_FILL, 0, 2, 0); - gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f); - gtk_table_attach(GTK_TABLE(table), - txt_lat = gtk_entry_new(), - 1, (DEG_FORMAT_ENUM_TEXT[_degformat].field_2_in_use ? 2 : 4), - 0, 1, GTK_FILL, 0, 2, 0); + gtk_dialog_add_button(GTK_DIALOG(dialog), + GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT); - if(DEG_FORMAT_ENUM_TEXT[_degformat].field_2_in_use) - { + /* Set the lat/lon strings. */ + gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), + table = gtk_table_new(6, cols, FALSE), TRUE, TRUE, 0); + gtk_table_attach(GTK_TABLE(table), label = gtk_label_new(DEG_FORMAT_ENUM_TEXT[_degformat] - .short_field_2), - 2, 3, 0, 1, GTK_FILL, 0, 2, 0); + .short_field_1), + 0, 1, 0, 1, GTK_FILL, 0, 2, 0); gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f); gtk_table_attach(GTK_TABLE(table), - txt_lon = gtk_entry_new(), - 3, 4, 0, 1, GTK_FILL, 0, 2, 0); - } + txt_lat = gtk_entry_new(), + 1, (DEG_FORMAT_ENUM_TEXT[_degformat].field_2_in_use ? 2 : 4), + 0, 1, GTK_FILL, 0, 2, 0); - gtk_table_attach(GTK_TABLE(table), - label = gtk_label_new(_("Cat")), - cols - 2, cols - 1, 0, 1, GTK_FILL, 0, 2, 0); - gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f); - gtk_table_attach(GTK_TABLE(table), - cmb_category = poi_create_cat_combo(), - cols - 1, cols - 0, 0, 1, GTK_EXPAND | GTK_FILL, 0, 2, 0); + if(DEG_FORMAT_ENUM_TEXT[_degformat].field_2_in_use) + { + gtk_table_attach(GTK_TABLE(table), + label = gtk_label_new(DEG_FORMAT_ENUM_TEXT[_degformat] + .short_field_2), + 2, 3, 0, 1, GTK_FILL, 0, 2, 0); + gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f); + gtk_table_attach(GTK_TABLE(table), + txt_lon = gtk_entry_new(), + 3, 4, 0, 1, GTK_FILL, 0, 2, 0); + } - gtk_table_attach(GTK_TABLE(table), - label = gtk_label_new(_("Label")), - 0, 1, 1, 2, GTK_FILL, 0, 2, 0); - gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f); - gtk_table_attach(GTK_TABLE(table), - txt_label = gtk_entry_new(), - 1, cols, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 0); + gtk_table_attach(GTK_TABLE(table), + label = gtk_label_new(_("Cat")), + cols - 2, cols - 1, 0, 1, GTK_FILL, 0, 2, 0); + gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f); + gtk_table_attach(GTK_TABLE(table), + cmb_category = poi_create_cat_combo(), + cols - 1, cols - 0, 0, 1, GTK_EXPAND | GTK_FILL, 0, 2, 0); - gtk_table_attach(GTK_TABLE(table), - label = gtk_label_new(_("Desc")), - 0, 1, 5, 6, GTK_FILL, GTK_FILL, 2, 0); - gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.0f); + gtk_table_attach(GTK_TABLE(table), + label = gtk_label_new(_("Label")), + 0, 1, 1, 2, GTK_FILL, 0, 2, 0); + gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f); + gtk_table_attach(GTK_TABLE(table), + txt_label = gtk_entry_new(), + 1, cols, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 0); - txt_scroll = gtk_scrolled_window_new(NULL, NULL); - gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(txt_scroll), - GTK_SHADOW_IN); - gtk_table_attach(GTK_TABLE(table), - txt_scroll, - 1, cols, 5, 6, GTK_EXPAND | GTK_FILL, 0, 2, 0); + gtk_table_attach(GTK_TABLE(table), + label = gtk_label_new(_("Desc")), + 0, 1, 5, 6, GTK_FILL, GTK_FILL, 2, 0); + gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.0f); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(txt_scroll), - GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); + txt_scroll = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(txt_scroll), + GTK_SHADOW_IN); + gtk_table_attach(GTK_TABLE(table), + txt_scroll, + 1, cols, 5, 6, GTK_EXPAND | GTK_FILL, 0, 2, 0); - txt_desc = gtk_text_view_new(); - gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(txt_desc), - GTK_WRAP_WORD_CHAR); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(txt_scroll), + GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); - gtk_container_add(GTK_CONTAINER(txt_scroll), txt_desc); - gtk_widget_set_size_request(GTK_WIDGET(txt_scroll), 600, 200); + txt_desc = gtk_text_view_new(); + gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(txt_desc), + GTK_WRAP_WORD_CHAR); - desc_txt = gtk_text_view_get_buffer(GTK_TEXT_VIEW (txt_desc)); + gtk_container_add(GTK_CONTAINER(txt_scroll), txt_desc); + gtk_widget_set_size_request(GTK_WIDGET(txt_scroll), 600, 200); + desc_txt = gtk_text_view_get_buffer(GTK_TEXT_VIEW(txt_desc)); + } + dpoi.txt_label = NULL; dpoi.deleted = FALSE; if (!is_add_dialog) @@ -1375,6 +1392,7 @@ { GtkTreeIter iter; const gchar *lat, *lon = NULL; + GtkTextIter begin, end; lat = gtk_entry_get_text(GTK_ENTRY(txt_lat)); if(txt_lon != NULL) @@ -1454,7 +1472,7 @@ map_force_redraw(); _degformat = last_deg_format; - gtk_widget_destroy(dialog); + gtk_widget_hide(dialog); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return !dpoi.deleted;