Fix:data_mg:Fixed some search bugs
authormartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Fri, 21 Mar 2008 17:52:14 +0000 (17:52 +0000)
committermartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Fri, 21 Mar 2008 17:52:14 +0000 (17:52 +0000)
git-svn-id: https://navit.svn.sourceforge.net/svnroot/navit/trunk@953 ffa7fe5e-494d-0410-b361-a75ebd5db220

navit/src/data/mg/map.c
navit/src/data/mg/town.c
navit/src/gui/gtk/destination.c
navit/src/search.c
navit/src/search.h

index 820d824..53e9c04 100644 (file)
@@ -321,6 +321,14 @@ map_search_new_mg(struct map_priv *map, struct item *item, struct attr *search,
        mr->m=map;
        mr->search_type=search->type;
        switch (search->type) {
+       case attr_town_postal:
+               if (item->type != type_country_label)
+                       return NULL;
+               tree_search_init(map->dirname, "town.b1", &mr->ts, 0);
+               mr->current_file=file_town_twn;
+               mr->search_str=g_strdup(search->u.str);
+               mr->search_country=mg_country_from_isonum(item->id_lo);
+               break;
        case attr_town_name:
                if (item->type != type_country_label)
                        return NULL;
@@ -369,6 +377,7 @@ map_search_get_item_mg(struct map_search_priv *ms)
        if (! mr)
                return NULL;
        switch (mr->search_type) {
+       case attr_town_postal:
        case attr_town_name:
                return town_search_get_item(mr);
        case attr_street_name:
index c7bec31..abadc32 100644 (file)
@@ -185,15 +185,23 @@ town_search_compare(unsigned char **p, struct map_rect_priv *mr)
         int country, d;
         char *name;
 
-       country=get_u16_unal(p);
-       dbg(1,"country 0x%x ", country);
-       name=get_string(p);
-       dbg(1,"name '%s' ",name);
-       mr->search_blk_count=get_u32_unal(p);
-       mr->search_blk_off=(struct block_offset *)(*p);
-       dbg(1,"len %d ", mr->search_blk_count);
-       (*p)+=mr->search_blk_count*4;
-       d=mr->search_country-country;
+       if (mr->search_type == attr_town_postal) {
+               mr->search_blk_count=1;
+               mr->search_blk_off=(struct block_offset *)(*p);
+               *p+=4;
+               name=get_string(p);
+               d=0;
+       } else {
+               country=get_u16_unal(p);
+               dbg(1,"country 0x%x ", country);
+               name=get_string(p);
+               dbg(1,"name '%s' ",name);
+               mr->search_blk_count=get_u32_unal(p);
+               mr->search_blk_off=(struct block_offset *)(*p);
+               dbg(1,"len %d ", mr->search_blk_count);
+               (*p)+=mr->search_blk_count*4;
+               d=mr->search_country-country;
+       }
        if (!d) {
                if (mr->search_partial)
                        d=strncasecmp(mr->search_str, name, strlen(mr->search_str));
@@ -213,41 +221,24 @@ town_search_get_item(struct map_rect_priv *mr)
        int dir=1,leaf;
 
        if (! mr->search_blk_count) {
-               if (mr->search_partial) {
-                       dbg(1,"partial 0x%x '%s' ***\n", mr->search_country, mr->search_str);
-                       if (! mr->search_linear) {
-                               while ((leaf=tree_search_next(&mr->ts, &mr->search_p, dir)) != -1) {
-                                       dir=town_search_compare(&mr->search_p, mr);
-                                       if (! dir && leaf) {
-                                               mr->search_linear=1;
-                                               mr->search_p=NULL;
-                                               break;
-                                       }
-                               }
-                               if (! mr->search_linear)
-                                       return NULL;
-                       }
-                       if (! tree_search_next_lin(&mr->ts, &mr->search_p))
-                               return NULL;
-                       if (town_search_compare(&mr->search_p, mr))
-                               return NULL;
-                       dbg(1,"found %d blocks\n",mr->search_blk_count);
-               } else {
-       #if 0
-                       dbg(1,"full 0x%x '%s' ***\n", country, search);
-                       while (tree_search_next(&ts, &p, dir) != -1) {
-                               ps=p;
-                               printf("0x%x ",p-ts.f->begin);
-                               dir=show_town2(&p, country, search, 0);
-                               if (! dir) {
-                                       printf("*** found full: ");
-                                       show_town2(&ps, country, search, 0);
+               dbg(1,"partial %d 0x%x '%s' ***\n", mr->search_partial, mr->search_country, mr->search_str);
+               if (! mr->search_linear) {
+                       while ((leaf=tree_search_next(&mr->ts, &mr->search_p, dir)) != -1) {
+                               dir=town_search_compare(&mr->search_p, mr);
+                               if (! dir && (mr->search_partial == 0 || leaf)) {
+                                       mr->search_linear=1;
+                                       mr->search_p=NULL;
                                        break;
                                }
                        }
-       #endif
-                       return NULL;
+                       if (! mr->search_linear)
+                               return NULL;
                }
+               if (! tree_search_next_lin(&mr->ts, &mr->search_p))
+                       return NULL;
+               if (town_search_compare(&mr->search_p, mr))
+                       return NULL;
+               dbg(1,"found %d blocks\n",mr->search_blk_count);
        }
        if (! mr->search_blk_count)
                return NULL;
index 9ee52ae..05f178e 100644 (file)
@@ -25,6 +25,7 @@ static struct search_param {
        struct mapset *ms;
        struct search_list *sl;
        struct attr attr;
+       int partial;
        GtkWidget *entry_country, *entry_postal, *entry_city, *entry_district;
        GtkWidget *entry_street, *entry_number;
        GtkWidget *listbox;
@@ -123,19 +124,84 @@ static void set_columns(struct search_param *param, int mode)
 
 }
 
+static void row_activated(GtkWidget *widget, GtkTreePath *p1, GtkTreeViewColumn *c, struct search_param *search)
+{
+       GtkTreePath *path;
+       GtkTreeViewColumn *focus_column;
+       GtkTreeIter iter;
+       GtkWidget *entry_widget;
+       char *str;
+       int column;
+
+       dbg(0,"enter\n");
+       gtk_tree_view_get_cursor(GTK_TREE_VIEW(search->treeview), &path, &focus_column);
+       gtk_tree_model_get_iter(search->liststore2, &iter, path);
+       switch(search->attr.type) {
+       case attr_country_all:
+               entry_widget=search->entry_country;
+               column=3;
+               break;
+       case attr_town_name:
+               entry_widget=search->entry_city;
+               column=2;
+               break;
+       case attr_street_name:
+               entry_widget=search->entry_street;
+               column=4;
+               break;
+       default:
+               dbg(0,"Unknown mode\n");
+               return;
+       }
+       gtk_tree_model_get(search->liststore2, &iter, column, &str, -1);
+       dbg(0,"str=%s\n", str);
+       search->partial=0;
+       gtk_entry_set_text(GTK_ENTRY(entry_widget), str);
+}
+
+static void tree_view_button_release(GtkWidget *widget, GdkEventButton *event, struct search_param *search)
+{
+       GtkTreePath *path;
+       GtkTreeViewColumn *column;
+       gtk_tree_view_get_cursor(GTK_TREE_VIEW(search->treeview), &path, &column);
+       gtk_tree_view_row_activated(GTK_TREE_VIEW(search->treeview), path, column);
+       
+}
+static void
+next_focus(struct search_param *search, GtkWidget *widget)
+{
+       if (widget == search->entry_country)
+               gtk_widget_grab_focus(search->entry_city);
+       if (widget == search->entry_city)
+               gtk_widget_grab_focus(search->entry_street);
+       if (widget == search->entry_street)
+               gtk_widget_grab_focus(search->entry_number);
+               
+}
+
 static void changed(GtkWidget *widget, struct search_param *search)
 {
        struct search_list_result *res;
        GtkTreeIter iter;
 
        search->attr.u.str=(char *)gtk_entry_get_text(GTK_ENTRY(widget));
-       printf("changed %s\n", search->attr.u.str);
+       printf("changed %s partial %d\n", search->attr.u.str, search->partial);
        if (widget == search->entry_country) {
+               gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (search->liststore2), 3, GTK_SORT_ASCENDING);
                dbg(0,"country\n");
                search->attr.type=attr_country_all;
                set_columns(search, 0);
        }
+       if (widget == search->entry_postal) {
+               gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (search->liststore2), 1, GTK_SORT_ASCENDING);
+               dbg(0,"postal\n");
+               search->attr.type=attr_town_postal;
+               if (strlen(search->attr.u.str) < 2)
+                       return;
+               set_columns(search, 1);
+       }
        if (widget == search->entry_city) {
+               gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (search->liststore2), 2, GTK_SORT_ASCENDING);
                dbg(0,"town\n");
                search->attr.type=attr_town_name;
                if (strlen(search->attr.u.str) < 3)
@@ -149,7 +215,7 @@ static void changed(GtkWidget *widget, struct search_param *search)
        }
 
 
-       search_list_search(search->sl, &search->attr, 1);
+       search_list_search(search->sl, &search->attr, search->partial);
        gtk_list_store_clear(search->liststore);
        while((res=search_list_get_result(search->sl))) {
                gtk_list_store_append(search->liststore,&iter);
@@ -169,7 +235,7 @@ static void changed(GtkWidget *widget, struct search_param *search)
                        if (res->town) {
                                gtk_list_store_set(search->liststore,&iter,1,res->town->postal,-1);
                                gtk_list_store_set(search->liststore,&iter,2,res->town->name,-1);
-                               gtk_list_store_set(search->liststore,&iter,3,"",-1);
+                               gtk_list_store_set(search->liststore,&iter,3,res->town->district,-1);
                        } else {
                                gtk_list_store_set(search->liststore,&iter,1,"",-1);
                                gtk_list_store_set(search->liststore,&iter,2,"",-1);
@@ -182,6 +248,9 @@ static void changed(GtkWidget *widget, struct search_param *search)
 
                }
        }
+       if (! search->partial)
+               next_focus(search, widget);
+       search->partial=1;
 }
 
 /* borrowed from gpe-login */
@@ -357,7 +426,7 @@ int destination_address(struct navit *nav)
                types[i]=G_TYPE_POINTER;
                 search->liststore=gtk_list_store_newv(COL_COUNT+1,types);
                 search->liststore2=gtk_tree_model_sort_new_with_model(GTK_TREE_MODEL(search->liststore));
-               gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (search->liststore2), 0, GTK_SORT_ASCENDING);
+               gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (search->liststore2), 3, GTK_SORT_ASCENDING);
                 gtk_tree_view_set_model (GTK_TREE_VIEW (search->treeview), GTK_TREE_MODEL(search->liststore2));
        }
 
@@ -400,6 +469,8 @@ int destination_address(struct navit *nav)
        g_signal_connect(G_OBJECT(button1), "clicked", G_CALLBACK(button_map), search);
        g_signal_connect(G_OBJECT(button2), "clicked", G_CALLBACK(button_bookmark), search);
        g_signal_connect(G_OBJECT(button3), "clicked", G_CALLBACK(button_destination), search);
+       g_signal_connect(G_OBJECT(search->treeview), "button-release-event", G_CALLBACK(tree_view_button_release), search);
+       g_signal_connect(G_OBJECT(search->treeview), "row_activated", G_CALLBACK(row_activated), search);
 
        gtk_widget_grab_focus(search->entry_city);
 
@@ -429,5 +500,6 @@ int destination_address(struct navit *nav)
        } else {
                dbg(0,"warning: no default country found\n");
        }
+       search->partial=1;
        return 0;
 }
index db89c14..a0deeea 100644 (file)
@@ -71,6 +71,9 @@ search_list_search(struct search_list *this_, struct attr *search_attr, int part
        case attr_country_name:
                level=0;
                break;
+       case attr_town_postal:
+               level=1;
+               break;
        case attr_town_name:
                level=1;
                break;
@@ -143,6 +146,8 @@ search_list_town_new(struct item *item)
                ret->name=map_convert_string(item->map,attr.u.str);
        if (item_attr_get(item, attr_town_postal, &attr))
                ret->postal=map_convert_string(item->map,attr.u.str);
+       if (item_attr_get(item, attr_district_name, &attr))
+               ret->district=map_convert_string(item->map,attr.u.str);
        if (item_coord_get(item, &c, 1)) {
                ret->c=g_new(struct pcoord, 1);
                ret->c->x=c.x;
index b4084f8..494e89c 100644 (file)
@@ -18,6 +18,7 @@ struct search_list_town {
        struct pcoord *c;
        char *postal;
        char *name;
+       char *district;
 };
 
 struct search_list_street {