2 * This file is part of mapper
4 * Copyright (C) 2007 Kaj-Michael Lang
5 * Copyright (C) 2006-2007 John Costigan.
7 * POI and GPS-Info code originally written by Cezary Jackiewicz.
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License along
20 * with this program; if not, write to the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
36 #include <glib/gstdio.h>
46 #include "mapper-types.h"
47 #include "ui-common.h"
63 typedef struct _search_dialog search_dialog;
64 struct _search_dialog {
67 GtkWidget *cmb_category;
69 GtkWidget *search_entry;
74 mapper_search_type stype;
77 static search_dialog sd;
78 static GSList *search_list=NULL;
79 static GtkListStore *search_model=NULL;
82 search_do_cb(GtkWidget *widget, gpointer data)
88 search_dialog *s=(search_dialog *)data;
90 slen=strlen(gtk_entry_get_text(GTK_ENTRY(s->search_entry)));
92 if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(s->cmb_category), &iter)==TRUE)
93 gtk_tree_model_get(gtk_combo_box_get_model(GTK_COMBO_BOX(s->cmb_category)), &iter, 0, &cid, -1);
96 if (s->stype==SEARCH_TYPE_POI && cid==-1 && slen<2) {
98 hildon_banner_show_information(s->dialog, NULL, _("Query string too short. Minimum 2 characters."));
100 popup_error(s->dialog, _("Query string too short. Minimum 2 characters."));
103 } else if (slen<2 && s->stype!=SEARCH_TYPE_POI) {
105 hildon_banner_show_information(s->dialog, NULL, _("Query string too short. Minimum 2 characters."));
107 popup_error(s->dialog, _("Query string too short. Minimum 2 characters."));
112 st=g_strdup(gtk_entry_get_text(GTK_ENTRY(s->search_entry)));
115 case SEARCH_TYPE_POI:
116 MACRO_BANNER_SHOW_INFO(s->dialog, _("Searching POIs..."));
117 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);
119 case SEARCH_TYPE_WAY:
120 MACRO_BANNER_SHOW_INFO(s->dialog, _("Searching streets..."));
121 sres=osm_way_search(s->lat, s->lon, st, &s->store);
123 case SEARCH_TYPE_PLACE:
124 sres=osm_place_search(s->lat, s->lon, st, &s->store);
129 if (!g_slist_find_custom(search_list, st, (GCompareFunc)strcmp)) {
130 search_list = g_slist_prepend(search_list, g_strdup(st));
131 gtk_list_store_insert_with_values(search_model, &iter, INT_MAX, 0, st, -1);
134 gtk_tree_view_set_model(GTK_TREE_VIEW(s->list), GTK_TREE_MODEL(s->store));
135 g_object_unref(G_OBJECT(s->store));
138 gtk_tree_view_set_model(GTK_TREE_VIEW(s->list), GTK_TREE_MODEL(s->store));
146 search_get_list_item_latlon(GtkWidget *list, gdouble *lat, gdouble *lon)
151 if (!gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(list)), NULL, &iter))
154 model=gtk_tree_view_get_model(GTK_TREE_VIEW(list));
158 gtk_tree_model_get(model, &iter, ITEM_LAT, lat, -1);
159 gtk_tree_model_get(model, &iter, ITEM_LON, lon, -1);
164 search_get_list_item_id(GtkWidget *list)
170 if (!gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(list)), NULL, &iter))
173 model=gtk_tree_view_get_model(GTK_TREE_VIEW(list));
177 gtk_tree_model_get(model, &iter, ITEM_ID, &id, -1);
182 search_set_dialog_mode(search_dialog *s)
184 s->stype=gtk_combo_box_get_active(GTK_COMBO_BOX(s->cmb_type));
186 case SEARCH_TYPE_POI:
187 gtk_widget_show(s->cmb_category);
189 case SEARCH_TYPE_WAY:
190 case SEARCH_TYPE_PLACE:
191 gtk_widget_hide(s->cmb_category);
194 g_assert_not_reached();
200 search_type_changed_cb(GtkWidget *widget, gpointer data)
202 search_dialog *s=(search_dialog *)data;
203 search_set_dialog_mode(s);
205 gtk_list_store_clear(s->store);
207 gtk_tree_view_set_model(GTK_TREE_VIEW(s->list), GTK_TREE_MODEL(s->store));
212 search_item_activated_cb(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer data)
214 search_dialog *s=(search_dialog *)data;
219 if (!gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view)), NULL, &iter))
222 model=gtk_tree_view_get_model(GTK_TREE_VIEW(tree_view));
226 gtk_tree_model_get(model, &iter, ITEM_LAT, &lat, -1);
227 gtk_tree_model_get(model, &iter, ITEM_LON, &lon, -1);
229 gtk_map_set_center_latlon(_map, lat, lon);
233 mapper_search_dialog(mapper_search_type stype, gdouble lat, gdouble lon)
235 GtkWidget *sw, *hbox, *label, *btn_search;
236 GtkTreeViewColumn *column;
237 GtkCellRenderer *renderer;
238 GtkEntryCompletion *search_comp;
246 sd.dialog = gtk_dialog_new_with_buttons(_("Search"),
249 _("Info"), SBTN_INFO,
250 _("Goto"), SBTN_GOTO,
251 _("Route to"), SBTN_ROUTETO,
252 _("Edit"), SBTN_EDIT,
253 GTK_STOCK_CLOSE, GTK_RESPONSE_REJECT,
256 if (search_model==NULL)
257 search_model=gtk_list_store_new(1, G_TYPE_STRING);
259 gtk_window_set_default_size(GTK_WINDOW(sd.dialog), 500, 300);
261 hbox = gtk_hbox_new(FALSE, 4),
262 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(sd.dialog)->vbox), hbox, FALSE, FALSE, 0);
264 label=gtk_label_new(_("Search:"));
265 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
267 sd.cmb_type=gtk_combo_box_new_text();
268 gtk_combo_box_append_text(GTK_COMBO_BOX(sd.cmb_type), "POI");
269 gtk_combo_box_append_text(GTK_COMBO_BOX(sd.cmb_type), "Street");
270 gtk_combo_box_append_text(GTK_COMBO_BOX(sd.cmb_type), "Place");
271 gtk_box_pack_start(GTK_BOX(hbox), sd.cmb_type, FALSE, FALSE, 0);
273 sd.cmb_category = category_combo_new();
274 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(sd.dialog)->vbox), sd.cmb_category, FALSE, FALSE, 0);
275 poi_category_combo_populate(sd.cmb_category, 0, TRUE);
277 sd.search_entry=gtk_entry_new();
278 search_comp=gtk_entry_completion_new();
279 gtk_entry_completion_set_model(search_comp, GTK_TREE_MODEL(search_model));
280 gtk_entry_completion_set_text_column(search_comp, 0);
281 gtk_entry_set_completion(GTK_ENTRY(sd.search_entry), search_comp);
282 gtk_box_pack_start(GTK_BOX(hbox), sd.search_entry, TRUE, TRUE, 0);
284 btn_search=gtk_button_new_with_label(_("Search"));
285 gtk_box_pack_start(GTK_BOX(hbox), btn_search, FALSE, FALSE, 0);
287 sw = gtk_scrolled_window_new(NULL, NULL);
288 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_ETCHED_IN);
289 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
290 #if defined(WITH_DEVICE_770) && defined(WITH_HILDON_NEW)
291 hildon_helper_set_thumb_scrollbar(sw, TRUE);
293 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(sd.dialog)->vbox), sw, TRUE, TRUE, 0);
295 sd.list=gtk_tree_view_new();
296 gtk_tree_selection_set_mode(gtk_tree_view_get_selection (GTK_TREE_VIEW(sd.list)), GTK_SELECTION_SINGLE);
297 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(sd.list), TRUE);
298 gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(sd.list), TRUE);
300 renderer = gtk_cell_renderer_text_new();
301 column = gtk_tree_view_column_new_with_attributes(_("Location"), renderer, "text", ITEM_LATLON, NULL);
302 gtk_tree_view_append_column(GTK_TREE_VIEW(sd.list), column);
304 renderer = gtk_cell_renderer_text_new();
305 column = gtk_tree_view_column_new_with_attributes(_("Distance"), renderer, "text", ITEM_DIST, NULL);
306 gtk_tree_view_column_set_sort_column_id (column, ITEM_DIST);
307 gtk_tree_view_append_column(GTK_TREE_VIEW(sd.list), column);
309 renderer = gtk_cell_renderer_text_new();
310 column = gtk_tree_view_column_new_with_attributes(_("Label"), renderer, "text", ITEM_LABEL, NULL);
311 gtk_tree_view_column_set_sort_column_id (column, ITEM_LABEL);
312 gtk_tree_view_append_column(GTK_TREE_VIEW(sd.list), column);
314 renderer = gtk_cell_renderer_text_new();
315 column = gtk_tree_view_column_new_with_attributes(_("Category"), renderer, "text", ITEM_CATLAB, NULL);
316 gtk_tree_view_column_set_sort_column_id (column, ITEM_CATLAB);
317 gtk_tree_view_append_column(GTK_TREE_VIEW(sd.list), column);
319 gtk_tree_view_set_search_column (GTK_TREE_VIEW(sd.list), ITEM_LABEL);
320 gtk_container_add(GTK_CONTAINER(sw), sd.list);
322 sd.label=gtk_label_new("");
323 gtk_box_pack_start(GTK_BOX(hbox), sd.label, FALSE, FALSE, 0);
325 g_signal_connect(G_OBJECT(btn_search), "clicked", G_CALLBACK(search_do_cb), &sd);
326 g_signal_connect(G_OBJECT(sd.cmb_type), "changed", G_CALLBACK(search_type_changed_cb), &sd);
327 g_signal_connect(G_OBJECT(sd.list), "row-activated", G_CALLBACK(search_item_activated_cb), &sd);
329 gtk_widget_show_all(sd.dialog);
330 gtk_combo_box_set_active(GTK_COMBO_BOX(sd.cmb_type), sd.stype);
331 search_set_dialog_mode(&sd);
333 while ((res=gtk_dialog_run(GTK_DIALOG(sd.dialog)))!=GTK_RESPONSE_REJECT) {
339 case SEARCH_TYPE_POI:
340 poi_info_dialog(sd.dialog, search_get_list_item_id(sd.list));
343 popup_error(sd.dialog, _("No information available."));
348 if (search_get_list_item_latlon(sd.list, &lat, &lon)==FALSE) {
350 hildon_banner_show_information(sd.dialog, NULL, _("Select a location from the list."));
352 popup_error(sd.dialog, _("Select a location from the list."));
355 gtk_map_set_center_latlon(_map, lat, lon);
360 if (search_get_list_item_latlon(sd.list, &lat, &lon)==FALSE) {
362 hildon_banner_show_information(sd.dialog, NULL, _("Select a location from the list."));
364 popup_error(sd.dialog, _("Select a location from the list."));
367 position_set(_dest, TRUE, lat, lon, 0);
373 case SEARCH_TYPE_POI: {
377 id=search_get_list_item_id(sd.list);
381 gtk_widget_destroy(sd.dialog);
382 poi_edit_dialog(ACTION_EDIT_POI, p);
383 return TRUE; /* XXX: for now, this is not nice.. */
385 popup_error(sd.dialog, _("Failed to fetch POI for editing."));
391 popup_error(sd.dialog, _("Only POIs can be modified."));
402 gtk_widget_destroy(sd.dialog);