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.
38 #include <glib/gstdio.h>
48 #include "mapper-types.h"
49 #include "ui-common.h"
57 typedef struct _search_query poi_search_query;
58 struct _search_query {
65 typedef struct _search_dialog search_dialog;
66 struct _search_dialog {
69 GtkWidget *cmb_category;
71 GtkWidget *search_entry;
76 mapper_search_type stype;
79 static search_dialog sd;
82 search_do_cb(GtkWidget *widget, gpointer data)
87 search_dialog *s=(search_dialog *)data;
89 if ((strlen(gtk_entry_get_text(s->search_entry))<2) && (cid==-1)) {
90 popup_error(s->dialog, _("Query string too short. Minimum 2 characters."));
94 st=g_strdup(gtk_entry_get_text(s->search_entry));
98 if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(s->cmb_category), &iter)==TRUE)
99 gtk_tree_model_get(gtk_combo_box_get_model(GTK_COMBO_BOX(s->cmb_category)), &iter, 0, &cid, -1);
103 if (poi_search((cid==-1) ? POI_SEARCH_TEXT : POI_SEARCH_TEXT_CAT, s->lat, s->lon, st, cid, &s->store)==TRUE) {
104 gtk_tree_view_set_model(GTK_TREE_VIEW(s->list), GTK_TREE_MODEL(s->store));
105 g_object_unref(G_OBJECT(s->store));
108 gtk_tree_view_set_model(GTK_TREE_VIEW(s->list), GTK_TREE_MODEL(s->store));
111 case SEARCH_TYPE_WAY:
112 popup_error(s->dialog, "Not yet implemented");
114 case SEARCH_TYPE_PLACE:
115 popup_error(s->dialog, "Not yet implemented");
123 search_goto_cb(GtkWidget *widget, gpointer data)
128 search_dialog *s=(search_dialog *)data;
130 if (!gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(s->list)), NULL, &iter)) {
131 popup_error(s->dialog, _("Select one POI from the list."));
135 model=gtk_tree_view_get_model(GTK_TREE_VIEW(s->list));
139 gtk_tree_model_get(model, &iter, ITEM_LAT, &lat, -1);
140 gtk_tree_model_get(model, &iter, ITEM_LON, &lon, -1);
142 map_center_latlon(lat, lon);
143 map_update_location_from_center();
149 search_route_to_cb(GtkWidget *widget, gpointer data)
153 search_dialog *s=(search_dialog *)data;
155 if (!gtk_tree_selection_get_selected(gtk_tree_view_get_selection(GTK_TREE_VIEW(s->list)), NULL, &iter)) {
156 popup_error(s->dialog, _("Select one POI from the list."));
160 model=gtk_tree_view_get_model(GTK_TREE_VIEW(s->list));
165 gtk_tree_model_get(model, &iter, ITEM_LAT, &_dest.lat, -1);
166 gtk_tree_model_get(model, &iter, ITEM_LON, &_dest.lon, -1);
168 map_update_location_from_center();
174 search_edit_cb(GtkWidget *widget, gpointer data)
181 search_set_dialog_mode(search_dialog *s)
183 s->stype=gtk_combo_box_get_active(GTK_COMBO_BOX(s->cmb_type));
185 case SEARCH_TYPE_POI:
186 gtk_widget_show(s->cmb_category);
187 gtk_widget_set_sensitive(s->btn_edit, TRUE);
189 case SEARCH_TYPE_WAY:
190 case SEARCH_TYPE_PLACE:
191 gtk_widget_hide(s->cmb_category);
192 gtk_widget_set_sensitive(s->btn_edit, FALSE);
195 g_assert_not_reached();
201 search_type_changed_cb(GtkWidget *widget, gpointer data)
203 search_dialog *s=(search_dialog *)data;
204 search_set_dialog_mode(s);
206 gtk_list_store_clear(s->store);
208 gtk_tree_view_set_model(GTK_TREE_VIEW(s->list), GTK_TREE_MODEL(s->store));
213 search_item_activated_cb(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
219 mapper_search_dialog(mapper_search_type stype, gdouble lat, gdouble lon)
221 GtkWidget *sw, *hbox, *label, *btn_search, *btn_goto, *btn_route_to;
222 GtkTreeViewColumn *column;
223 GtkCellRenderer *renderer;
230 sd.dialog = gtk_dialog_new_with_buttons(_("Search"),
237 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(sd.dialog)->action_area), btn_goto = gtk_button_new_with_label(_("Go to")));
238 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(sd.dialog)->action_area), btn_route_to = gtk_button_new_with_label(_("Route to")));
239 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(sd.dialog)->action_area), sd.btn_edit = gtk_button_new_with_label(_("Edit")));
241 gtk_window_set_default_size(GTK_WINDOW(sd.dialog), 500, 300);
243 hbox = gtk_hbox_new(FALSE, 4),
244 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(sd.dialog)->vbox), hbox, FALSE, FALSE, 0);
246 label=gtk_label_new(_("Search:"));
247 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
249 sd.cmb_type=gtk_combo_box_new_text();
250 gtk_combo_box_append_text(GTK_COMBO_BOX(sd.cmb_type), "POI");
251 gtk_combo_box_append_text(GTK_COMBO_BOX(sd.cmb_type), "Street");
252 gtk_combo_box_append_text(GTK_COMBO_BOX(sd.cmb_type), "Place");
253 gtk_box_pack_start(GTK_BOX(hbox), sd.cmb_type, FALSE, FALSE, 0);
255 sd.cmb_category = category_combo_new();
256 gtk_box_pack_start(GTK_BOX(hbox), sd.cmb_category, FALSE, FALSE, 0);
257 poi_category_combo_populate(sd.cmb_category, 0, TRUE);
259 sd.search_entry=gtk_entry_new();
260 gtk_box_pack_start(GTK_BOX(hbox), sd.search_entry, TRUE, TRUE, 0);
262 btn_search=gtk_button_new_with_label(_("Search"));
263 gtk_box_pack_start(GTK_BOX(hbox), btn_search, FALSE, FALSE, 0);
265 sw = gtk_scrolled_window_new(NULL, NULL);
266 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_ETCHED_IN);
267 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
268 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(sd.dialog)->vbox), sw, TRUE, TRUE, 0);
270 sd.list=gtk_tree_view_new();
271 gtk_tree_selection_set_mode(gtk_tree_view_get_selection (GTK_TREE_VIEW(sd.list)), GTK_SELECTION_SINGLE);
272 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(sd.list), TRUE);
273 gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(sd.list), TRUE);
275 renderer = gtk_cell_renderer_text_new();
276 column = gtk_tree_view_column_new_with_attributes(_("Location"), renderer, "text", ITEM_LATLON, NULL);
277 gtk_tree_view_append_column(GTK_TREE_VIEW(sd.list), column);
279 renderer = gtk_cell_renderer_text_new();
280 column = gtk_tree_view_column_new_with_attributes(_("Distance"), renderer, "text", ITEM_DIST, NULL);
281 gtk_tree_view_column_set_sort_column_id (column, ITEM_DIST);
282 gtk_tree_view_append_column(GTK_TREE_VIEW(sd.list), column);
284 renderer = gtk_cell_renderer_text_new();
285 column = gtk_tree_view_column_new_with_attributes(_("Label"), renderer, "text", ITEM_LABEL, NULL);
286 gtk_tree_view_column_set_sort_column_id (column, ITEM_LABEL);
287 gtk_tree_view_append_column(GTK_TREE_VIEW(sd.list), column);
289 renderer = gtk_cell_renderer_text_new();
290 column = gtk_tree_view_column_new_with_attributes(_("Category"), renderer, "text", ITEM_CATLAB, NULL);
291 gtk_tree_view_column_set_sort_column_id (column, ITEM_CATLAB);
292 gtk_tree_view_append_column(GTK_TREE_VIEW(sd.list), column);
294 gtk_tree_view_set_search_column (GTK_TREE_VIEW(sd.list), ITEM_LABEL);
295 gtk_container_add(GTK_CONTAINER(sw), sd.list);
297 g_signal_connect(G_OBJECT(btn_search), "clicked", G_CALLBACK(search_do_cb), &sd);
298 g_signal_connect(G_OBJECT(btn_goto), "clicked", G_CALLBACK(search_goto_cb), &sd);
299 g_signal_connect(G_OBJECT(btn_route_to), "clicked", G_CALLBACK(search_route_to_cb), &sd);
300 g_signal_connect(G_OBJECT(sd.btn_edit), "clicked", G_CALLBACK(search_edit_cb), &sd);
301 g_signal_connect(G_OBJECT(sd.cmb_type), "changed", G_CALLBACK(search_type_changed_cb), &sd);
302 g_signal_connect(G_OBJECT(sd.list), "row-activated", G_CALLBACK(search_item_activated_cb), &sd);
304 gtk_widget_show_all(sd.dialog);
305 gtk_combo_box_set_active(GTK_COMBO_BOX(sd.cmb_type), sd.stype);
306 search_set_dialog_mode(&sd);
308 gtk_dialog_run(GTK_DIALOG(sd.dialog));
310 gtk_widget_destroy(sd.dialog);