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;
