#include <config.h>
-#define _GNU_SOURCE
-
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include "poi-gui.h"
#include "osm.h"
#include "help.h"
-
+#include "osm-db.h"
#include "search.h"
-
-typedef struct _search_query poi_search_query;
-struct _search_query {
- gdouble lat;
- gdouble lon;
- guint cat_id;
- gchar *query;
-};
+#include "dialogs.h"
typedef struct _search_dialog search_dialog;
struct _search_dialog {
GtkWidget *cmb_category;
GtkWidget *list;
GtkWidget *search_entry;
- GtkWidget *btn_edit;
+ GtkWidget *label;
GtkListStore *store;
gdouble lat;
gdouble lon;
};
static search_dialog sd;
+static GtkListStore *search_model=NULL;
static gboolean
search_do_cb(GtkWidget *widget, gpointer data)
gchar *st;
guint cid;
GtkTreeIter iter;
+guint slen;
search_dialog *s=(search_dialog *)data;
-
-if ((strlen(gtk_entry_get_text(GTK_ENTRY(s->search_entry)))<2) && (cid==-1)) {
+gboolean sres=FALSE;
+slen=strlen(gtk_entry_get_text(GTK_ENTRY(s->search_entry)));
+
+if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(s->cmb_category), &iter)==TRUE)
+ gtk_tree_model_get(gtk_combo_box_get_model(GTK_COMBO_BOX(s->cmb_category)), &iter, 0, &cid, -1);
+else
+ cid=-1;
+if (s->stype==SEARCH_TYPE_POI && cid==-1 && slen<2) {
+#ifdef WITH_HILDON
+ hildon_banner_show_information(s->dialog, NULL, _("Query string too short. Minimum 2 characters."));
+#else
+ popup_error(s->dialog, _("Query string too short. Minimum 2 characters."));
+#endif
+ return TRUE;
+} else if (slen<2 && s->stype!=SEARCH_TYPE_POI) {
+#ifdef WITH_HILDON
+ hildon_banner_show_information(s->dialog, NULL, _("Query string too short. Minimum 2 characters."));
+#else
popup_error(s->dialog, _("Query string too short. Minimum 2 characters."));
+#endif
return TRUE;
}
switch (s->stype) {
case SEARCH_TYPE_POI:
- if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(s->cmb_category), &iter)==TRUE)
- gtk_tree_model_get(gtk_combo_box_get_model(GTK_COMBO_BOX(s->cmb_category)), &iter, 0, &cid, -1);
- else
- cid=-1;
-
- if (poi_search((cid==-1) ? POI_SEARCH_TEXT : POI_SEARCH_TEXT_CAT, s->lat, s->lon, st, cid, &s->store)==TRUE) {
- gtk_tree_view_set_model(GTK_TREE_VIEW(s->list), GTK_TREE_MODEL(s->store));
- g_object_unref(G_OBJECT(s->store));
- } else {
- s->store=NULL;
- gtk_tree_view_set_model(GTK_TREE_VIEW(s->list), GTK_TREE_MODEL(s->store));
- }
+ MACRO_BANNER_SHOW_INFO(s->dialog, _("Searching POIs..."));
+ sres=poi_search((cid==-1 && slen>0) ? POI_SEARCH_TEXT : (cid!=-1 && slen==0) ? POI_SEARCH_CAT : POI_SEARCH_TEXT_CAT, s->lat, s->lon, st, cid, &s->store);
break;
case SEARCH_TYPE_WAY:
- if (osm_way_search(s->lat, s->lon, st, &s->store)==TRUE) {
- gtk_tree_view_set_model(GTK_TREE_VIEW(s->list), GTK_TREE_MODEL(s->store));
- g_object_unref(G_OBJECT(s->store));
- } else {
- s->store=NULL;
- gtk_tree_view_set_model(GTK_TREE_VIEW(s->list), GTK_TREE_MODEL(s->store));
- }
- popup_error(s->dialog, "Not yet implemented");
+ MACRO_BANNER_SHOW_INFO(s->dialog, _("Searching streets..."));
+ sres=osm_way_search(s->lat, s->lon, st, &s->store);
break;
case SEARCH_TYPE_PLACE:
- popup_error(s->dialog, "Not yet implemented");
+ sres=osm_place_search(s->lat, s->lon, st, &s->store);
break;
}
+
+if (sres==TRUE) {
+ gtk_tree_view_set_model(GTK_TREE_VIEW(s->list), GTK_TREE_MODEL(s->store));
+ g_object_unref(G_OBJECT(s->store));
+} else {
+ s->store=NULL;
+ gtk_tree_view_set_model(GTK_TREE_VIEW(s->list), GTK_TREE_MODEL(s->store));
+}
+
g_free(st);
return TRUE;
}
static gboolean
-search_goto_cb(GtkWidget *widget, gpointer data)
+search_get_list_item_latlon(GtkWidget *list, gdouble *lat, gdouble *lon)
{
GtkTreeIter iter;
GtkTreeModel *model;
-gdouble lat, lon;
-search_dialog *s=(search_dialog *)data;
-if (!gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(s->list)), NULL, &iter)) {
- popup_error(s->dialog, _("Select one POI from the list."));
- return TRUE;
-}
+if (!gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(list)), NULL, &iter))
+ return FALSE;
-model=gtk_tree_view_get_model(GTK_TREE_VIEW(s->list));
+model=gtk_tree_view_get_model(GTK_TREE_VIEW(list));
if (!model)
- return TRUE;
-
-gtk_tree_model_get(model, &iter, ITEM_LAT, &lat, -1);
-gtk_tree_model_get(model, &iter, ITEM_LON, &lon, -1);
-
-map_center_latlon(lat, lon);
-map_update_location_from_center();
+ return FALSE;
+gtk_tree_model_get(model, &iter, ITEM_LAT, lat, -1);
+gtk_tree_model_get(model, &iter, ITEM_LON, lon, -1);
return TRUE;
}
-static gboolean
-search_route_to_cb(GtkWidget *widget, gpointer data)
+static guint
+search_get_list_item_id(GtkWidget *list)
{
+guint id;
GtkTreeIter iter;
GtkTreeModel *model;
-search_dialog *s=(search_dialog *)data;
-if (!gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(s->list)), NULL, &iter)) {
- popup_error(s->dialog, _("Select one POI from the list."));
- return TRUE;
-}
+if (!gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(list)), NULL, &iter))
+ return 0;
-model=gtk_tree_view_get_model(GTK_TREE_VIEW(s->list));
+model=gtk_tree_view_get_model(GTK_TREE_VIEW(list));
if (!model)
- return TRUE;
-
-_dest.valid=TRUE;
-gtk_tree_model_get(model, &iter, ITEM_LAT, &_dest.lat, -1);
-gtk_tree_model_get(model, &iter, ITEM_LON, &_dest.lon, -1);
+ return 0;
-map_update_location_from_center();
-
-return TRUE;
-}
-
-static gboolean
-search_edit_cb(GtkWidget *widget, gpointer data)
-{
-
-return TRUE;
+gtk_tree_model_get(model, &iter, ITEM_ID, &id, -1);
+return id;
}
static void
switch (s->stype) {
case SEARCH_TYPE_POI:
gtk_widget_show(s->cmb_category);
- gtk_widget_set_sensitive(s->btn_edit, TRUE);
break;
case SEARCH_TYPE_WAY:
case SEARCH_TYPE_PLACE:
gtk_widget_hide(s->cmb_category);
- gtk_widget_set_sensitive(s->btn_edit, FALSE);
break;
default:
g_assert_not_reached();
}
static void
-search_item_activated_cb(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
+search_item_activated_cb(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer data)
{
-g_printf("Boom!\n");
+search_dialog *s=(search_dialog *)data;
+gdouble lat, lon;
+GtkTreeIter iter;
+GtkTreeModel *model;
+
+if (!gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view)), NULL, &iter))
+ return;
+
+model=gtk_tree_view_get_model(GTK_TREE_VIEW(tree_view));
+if (!model)
+ return;
+
+gtk_tree_model_get(model, &iter, ITEM_LAT, &lat, -1);
+gtk_tree_model_get(model, &iter, ITEM_LON, &lon, -1);
+
+map_center_latlon(lat, lon);
+g_idle_add_full(G_PRIORITY_HIGH_IDLE,(GSourceFunc)map_update_location_from_center, NULL, NULL);
+#if 0
+gtk_widget_destroy(s->dialog);
+#endif
}
gboolean
mapper_search_dialog(mapper_search_type stype, gdouble lat, gdouble lon)
{
-GtkWidget *sw, *hbox, *label, *btn_search, *btn_goto, *btn_route_to;
+GtkWidget *sw, *hbox, *label, *btn_search;
GtkTreeViewColumn *column;
GtkCellRenderer *renderer;
+GtkEntryCompletion *search_comp;
+gint res;
sd.store=NULL;
sd.lat=lat;
sd.dialog = gtk_dialog_new_with_buttons(_("Search"),
GTK_WINDOW(_window),
- GTK_DIALOG_MODAL,
- GTK_STOCK_CANCEL,
- GTK_RESPONSE_REJECT,
+ GTK_DIALOG_MODAL,
+ _("Goto"), 1,
+ _("Route to"), 2,
+ _("Edit"), 3,
+ GTK_STOCK_CLOSE, GTK_RESPONSE_REJECT,
NULL);
-gtk_container_add(GTK_CONTAINER(GTK_DIALOG(sd.dialog)->action_area), btn_goto = gtk_button_new_with_label(_("Go to")));
-gtk_container_add(GTK_CONTAINER(GTK_DIALOG(sd.dialog)->action_area), btn_route_to = gtk_button_new_with_label(_("Route to")));
-gtk_container_add(GTK_CONTAINER(GTK_DIALOG(sd.dialog)->action_area), sd.btn_edit = gtk_button_new_with_label(_("Edit")));
+if (search_model==NULL)
+ search_model=gtk_list_store_new(1, G_TYPE_STRING);
gtk_window_set_default_size(GTK_WINDOW(sd.dialog), 500, 300);
poi_category_combo_populate(sd.cmb_category, 0, TRUE);
sd.search_entry=gtk_entry_new();
+search_comp=gtk_entry_completion_new();
+gtk_entry_completion_set_model(search_comp, GTK_TREE_MODEL(search_model));
+gtk_entry_completion_set_text_column(search_comp, 0);
+gtk_entry_set_completion(GTK_ENTRY(sd.search_entry), search_comp);
gtk_box_pack_start(GTK_BOX(hbox), sd.search_entry, TRUE, TRUE, 0);
btn_search=gtk_button_new_with_label(_("Search"));
gtk_tree_view_set_search_column (GTK_TREE_VIEW(sd.list), ITEM_LABEL);
gtk_container_add(GTK_CONTAINER(sw), sd.list);
+sd.label=gtk_label_new("");
+gtk_box_pack_start(GTK_BOX(hbox), sd.label, FALSE, FALSE, 0);
+
g_signal_connect(G_OBJECT(btn_search), "clicked", G_CALLBACK(search_do_cb), &sd);
-g_signal_connect(G_OBJECT(btn_goto), "clicked", G_CALLBACK(search_goto_cb), &sd);
-g_signal_connect(G_OBJECT(btn_route_to), "clicked", G_CALLBACK(search_route_to_cb), &sd);
-g_signal_connect(G_OBJECT(sd.btn_edit), "clicked", G_CALLBACK(search_edit_cb), &sd);
g_signal_connect(G_OBJECT(sd.cmb_type), "changed", G_CALLBACK(search_type_changed_cb), &sd);
g_signal_connect(G_OBJECT(sd.list), "row-activated", G_CALLBACK(search_item_activated_cb), &sd);
gtk_combo_box_set_active(GTK_COMBO_BOX(sd.cmb_type), sd.stype);
search_set_dialog_mode(&sd);
-gtk_dialog_run(GTK_DIALOG(sd.dialog));
+while ((res=gtk_dialog_run(GTK_DIALOG(sd.dialog)))!=GTK_RESPONSE_REJECT) {
+ gdouble lat, lon;
+
+ switch (res) {
+ case 1:
+ if (search_get_list_item_latlon(sd.list, &lat, &lon)==FALSE) {
+ popup_error(sd.dialog, _("Select a location from the list."));
+ } else {
+ map_center_latlon(lat, lon);
+ g_idle_add_full(G_PRIORITY_HIGH_IDLE,(GSourceFunc)map_update_location_from_center, NULL, NULL);
+ }
+ continue;
+ break;
+ case 2:
+ if (search_get_list_item_latlon(sd.list, &_dest.lat, &_dest.lon)==FALSE) {
+ popup_error(sd.dialog, _("Select a location from the list."));
+ } else {
+ _dest.valid=TRUE;
+ g_idle_add_full(G_PRIORITY_HIGH_IDLE,(GSourceFunc)map_update_location_from_center, NULL, NULL);
+ }
+ continue;
+ break;
+ case 3:
+ switch (sd.stype) {
+ case SEARCH_TYPE_POI: {
+ poi_info *p=NULL;
+ guint id;
+
+ id=search_get_list_item_id(sd.list);
+ if (id>0) {
+ p=poi_get_by_id(id);
+ if (p) {
+ gtk_widget_destroy(sd.dialog);
+ poi_edit_dialog(ACTION_EDIT_POI, p);
+ return TRUE; /* XXX: for now, this is not nice.. */
+ } else {
+ popup_error(sd.dialog, _("Failed to fetch POI for editing."));
+ }
+ }
+ }
+ break;
+ default:
+ popup_error(sd.dialog, _("Only POIs can be modified."));
+ break;
+ }
+ continue;
+ break;
+ default:
+ break;
+ break;
+ }
+}
gtk_widget_destroy(sd.dialog);
return TRUE;