2 * Copyright (C) 2006, 2007 John Costigan.
4 * POI and GPS-Info code originally written by Cezary Jackiewicz.
6 * Default map data provided by http://www.openstreetmap.org/
8 * This file is part of Maemo Mapper.
10 * Maemo Mapper is free software: you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation, either version 3 of the License, or
13 * (at your option) any later version.
15 * Maemo Mapper is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with Maemo Mapper. If not, see <http://www.gnu.org/licenses/>.
34 # include <hildon/hildon-help.h>
35 # include <hildon/hildon-note.h>
36 # include <hildon/hildon-file-chooser-dialog.h>
37 # include <hildon/hildon-number-editor.h>
38 # include <hildon/hildon-banner.h>
40 # include <osso-helplib.h>
41 # include <hildon-widgets/hildon-note.h>
42 # include <hildon-widgets/hildon-file-chooser-dialog.h>
43 # include <hildon-widgets/hildon-number-editor.h>
44 # include <hildon-widgets/hildon-banner.h>
45 # include <hildon-widgets/hildon-input-mode-hint.h>
55 #include "gdk-pixbuf-rotate.h"
61 static sqlite3 *_poi_db = NULL;
62 static sqlite3_stmt *_stmt_browse_poi = NULL;
63 static sqlite3_stmt *_stmt_browsecat_poi = NULL;
64 static sqlite3_stmt *_stmt_select_poi = NULL;
65 static sqlite3_stmt *_stmt_select_nearest_poi = NULL;
66 static sqlite3_stmt *_stmt_insert_poi = NULL;
67 static sqlite3_stmt *_stmt_update_poi = NULL;
68 static sqlite3_stmt *_stmt_delete_poi = NULL;
69 static sqlite3_stmt *_stmt_delete_poi_by_catid = NULL;
70 static sqlite3_stmt *_stmt_nextlabel_poi = NULL;
71 static sqlite3_stmt *_stmt_select_cat = NULL;
72 static sqlite3_stmt *_stmt_insert_cat = NULL;
73 static sqlite3_stmt *_stmt_update_cat = NULL;
74 static sqlite3_stmt *_stmt_delete_cat = NULL;
75 static sqlite3_stmt *_stmt_toggle_cat = NULL;
76 static sqlite3_stmt *_stmt_selall_cat = NULL;
78 typedef struct _PoiListInfo PoiListInfo;
83 GtkTreeViewColumn *select_column;
88 typedef struct _OriginToggleInfo OriginToggleInfo;
89 struct _OriginToggleInfo {
90 GtkWidget *rad_use_gps;
91 GtkWidget *rad_use_route;
92 GtkWidget *rad_use_text;
93 GtkWidget *txt_origin;
97 typedef struct _PoiCategoryEditInfo PoiCategoryEditInfo;
98 struct _PoiCategoryEditInfo
101 GtkWidget *cmb_category;
103 GtkWidget *tree_view;
106 /** Data used during action: add or edit category/poi **/
107 typedef struct _DeletePOI DeletePOI;
121 gchar *db_dirname = NULL;
122 printf("%s()\n", __PRETTY_FUNCTION__);
126 sqlite3_close(_poi_db);
130 if(!_poi_db_filename)
134 else if(NULL == (db_dirname = g_path_get_dirname(_poi_db_filename))
135 || (g_mkdir_with_parents(db_dirname, 0755), /* comma operator */
136 (SQLITE_OK != (sqlite3_open(_poi_db_filename, &_poi_db)))))
138 gchar buffer2[BUFFER_SIZE];
139 snprintf(buffer2, sizeof(buffer2),
140 "%s: %s", _("Error with POI database"),
141 sqlite3_errmsg(_poi_db));
142 sqlite3_close(_poi_db);
144 popup_error(_window, buffer2);
146 else if(SQLITE_OK != sqlite3_get_table(_poi_db,
147 "select label from poi limit 1",
148 &pszResult, &nRow, &nColumn, NULL))
150 gchar *create_sql = sqlite3_mprintf(
151 "create table poi (poi_id integer PRIMARY KEY, lat real, "
152 "lon real, label text, desc text, cat_id integer);"
153 "create table category (cat_id integer PRIMARY KEY,"
154 "label text, desc text, enabled integer);"
155 /* Add some default categories... */
156 "insert into category (label, desc, enabled) "
157 "values ('%q', '%q', 1); "
158 "insert into category (label, desc, enabled) "
159 "values ('%q', '%q', 1); "
160 "insert into category (label, desc, enabled) "
161 "values ('%q', '%q', 1); "
162 "insert into category (label, desc, enabled) "
163 "values ('%q', '%q', 1); "
164 "insert into category (label, desc, enabled) "
165 "values ('%q', '%q', 1); "
166 "insert into category (label, desc, enabled) "
167 "values ('%q', '%q', 1); "
168 "insert into category (label, desc, enabled) "
169 "values ('%q', '%q', 1); "
170 "insert into category (label, desc, enabled) "
171 "values ('%q', '%q', 1); "
172 "insert into category (label, desc, enabled) "
173 "values ('%q', '%q', 1); "
174 "insert into category (label, desc, enabled) "
175 "values ('%q', '%q', 1); "
176 "insert into category (label, desc, enabled) "
177 "values ('%q', '%q', 1); ",
178 _("Service Station"),
179 _("Stations for purchasing fuel for vehicles."),
181 _("Houses, apartments, or other residences of import."),
183 _("Places to eat or drink."),
184 _("Shopping/Services"),
185 _("Places to shop or acquire services."),
187 _("Indoor or Outdoor places to have fun."),
189 _("Bus stops, airports, train stations, etc."),
191 _("Places to stay temporarily or for the night."),
193 _("Elementary schools, college campuses, etc."),
195 _("General places of business."),
197 _("General landmarks."),
199 _("Miscellaneous category for everything else."));
201 if(SQLITE_OK != sqlite3_exec(_poi_db, create_sql, NULL, NULL, NULL)
202 && (SQLITE_OK != sqlite3_get_table(_poi_db,
203 "select label from poi limit 1",
204 &pszResult, &nRow, &nColumn, NULL)))
206 snprintf(buffer, sizeof(buffer), "%s:\n%s",
207 _("Failed to open or create database"),
208 sqlite3_errmsg(_poi_db));
209 sqlite3_close(_poi_db);
211 popup_error(_window, buffer);
215 sqlite3_free_table(pszResult);
221 /* Prepare our SQL statements. */
223 sqlite3_prepare(_poi_db,
224 "select p.poi_id, p.cat_id, p.lat, p.lon,"
225 " p.label, p.desc, c.label"
226 " from poi p inner join category c"
227 " on p.cat_id = c.cat_id"
228 " where c.enabled = 1"
229 " and p.label like $QUERY or p.desc like $QUERY"
230 " order by (($LAT - p.lat) * ($LAT - p.lat) "
231 "+ ($LON - p.lon) * ($LON - p.lon)) DESC "
233 -1, &_stmt_browse_poi, NULL);
235 /* browse poi by category */
236 sqlite3_prepare(_poi_db,
237 "select p.poi_id, p.cat_id, p.lat, p.lon,"
238 " p.label, p.desc, c.label"
239 " from poi p inner join category c"
240 " on p.cat_id = c.cat_id"
241 " where c.enabled = 1"
242 " and p.cat_id = $CATID"
243 " and ( p.label like $QUERY or p.desc like $QUERY )"
244 " order by (($LAT - p.lat) * ($LAT - p.lat) "
245 "+ ($LON - p.lon) * ($LON - p.lon)) DESC"
247 -1, &_stmt_browsecat_poi, NULL);
249 /* Prepare our SQL statements. */
250 /* select from poi */
251 sqlite3_prepare(_poi_db,
252 "select p.lat, p.lon, p.poi_id, p.label, p.desc,"
253 " p.cat_id, c.label, c.desc"
254 " from poi p inner join category c"
255 " on p.cat_id = c.cat_id"
256 " where c.enabled = 1"
257 " and p.lat between ? and ? "
258 " and p.lon between ? and ? ",
259 -1, &_stmt_select_poi, NULL);
261 /* select nearest pois */
262 sqlite3_prepare(_poi_db,
263 "select p.poi_id, p.cat_id, p.lat, p.lon,"
264 " p.label, p.desc, c.label"
265 " from poi p inner join category c"
266 " on p.cat_id = c.cat_id"
267 " where c.enabled = 1"
268 " order by (($LAT - p.lat) * ($LAT - p.lat) "
269 "+ ($LON - p.lon) * ($LON - p.lon)) limit 1",
270 -1, &_stmt_select_nearest_poi, NULL);
273 sqlite3_prepare(_poi_db,
274 "insert into poi (lat, lon, label, desc, cat_id)"
275 " values (?, ?, ?, ?, ?)",
276 -1, &_stmt_insert_poi, NULL);
278 sqlite3_prepare(_poi_db,
279 "update poi set lat = ?, lon = ?, "
280 "label = ?, desc = ?, cat_id = ? where poi_id = ?",
281 -1, &_stmt_update_poi, NULL);
282 /* delete from poi */
283 sqlite3_prepare(_poi_db,
284 " delete from poi where poi_id = ?",
285 -1, &_stmt_delete_poi, NULL);
286 /* delete from poi by cat_id */
287 sqlite3_prepare(_poi_db,
288 "delete from poi where cat_id = ?",
289 -1, &_stmt_delete_poi_by_catid, NULL);
290 /* get next poilabel */
291 sqlite3_prepare(_poi_db,
292 "select ifnull(max(poi_id) + 1,1) from poi",
293 -1, &_stmt_nextlabel_poi, NULL);
295 /* select from category */
296 sqlite3_prepare(_poi_db,
297 "select c.label, c.desc, c.enabled"
298 " from category c where c.cat_id = ?",
299 -1, &_stmt_select_cat, NULL);
300 /* insert into category */
301 sqlite3_prepare(_poi_db,
302 "insert into category (label, desc, enabled)"
304 -1, &_stmt_insert_cat, NULL);
305 /* update category */
306 sqlite3_prepare(_poi_db,
307 "update category set label = ?, desc = ?,"
308 " enabled = ? where cat_id = ?",
309 -1, &_stmt_update_cat, NULL);
310 /* delete from category */
311 sqlite3_prepare(_poi_db,
312 "delete from category where cat_id = ?",
313 -1, &_stmt_delete_cat, NULL);
314 /* enable category */
315 sqlite3_prepare(_poi_db,
316 "update category set enabled = ?"
318 -1, &_stmt_toggle_cat, NULL);
319 /* select all category */
320 sqlite3_prepare(_poi_db,
321 "select c.cat_id, c.label, c.desc, c.enabled,"
324 " left outer join poi p on c.cat_id = p.cat_id"
325 " group by c.cat_id, c.label, c.desc, c.enabled "
327 -1, &_stmt_selall_cat, NULL);
330 _poi_enabled = _poi_db != NULL;
332 gtk_widget_set_sensitive(_menu_poi_item, _poi_enabled);
333 gtk_widget_set_sensitive(_cmenu_loc_add_poi_item, _poi_enabled);
334 gtk_widget_set_sensitive(_cmenu_loc_download_poi_item, _poi_enabled);
335 gtk_widget_set_sensitive(_cmenu_loc_browse_poi_item, _poi_enabled);
336 gtk_widget_set_sensitive(_cmenu_way_add_poi_item, _poi_enabled);
337 gtk_widget_set_sensitive(_cmenu_poi_submenu, _poi_enabled);
339 vprintf("%s(): return\n", __PRETTY_FUNCTION__);
343 get_nearest_poi(gint unitx, gint unity, PoiInfo *poi)
345 printf("%s(%d, %d)\n", __PRETTY_FUNCTION__, unitx, unity);
348 unit2latlon(unitx, unity, lat, lon);
350 if(SQLITE_OK == sqlite3_bind_double(_stmt_select_nearest_poi, 1, lat)
351 && SQLITE_OK == sqlite3_bind_double(_stmt_select_nearest_poi, 2, lon)
352 && SQLITE_ROW == sqlite3_step(_stmt_select_nearest_poi))
354 poi->poi_id = sqlite3_column_int(_stmt_select_nearest_poi, 0);
355 poi->cat_id = sqlite3_column_int(_stmt_select_nearest_poi, 1);
356 poi->lat = sqlite3_column_double(_stmt_select_nearest_poi, 2);
357 poi->lon = sqlite3_column_double(_stmt_select_nearest_poi, 3);
358 poi->label =g_strdup(sqlite3_column_text(_stmt_select_nearest_poi, 4));
359 poi->desc = g_strdup(sqlite3_column_text(_stmt_select_nearest_poi, 5));
360 poi->clabel=g_strdup(sqlite3_column_text(_stmt_select_nearest_poi, 6));
365 sqlite3_reset(_stmt_select_nearest_poi);
366 vprintf("%s(): return %d\n", __PRETTY_FUNCTION__, result);
371 select_poi(gint unitx, gint unity, PoiInfo *poi, gboolean quick)
374 gdouble lat1, lon1, lat2, lon2;
375 static GtkWidget *dialog = NULL;
376 static GtkWidget *list = NULL;
377 static GtkWidget *sw = NULL;
378 static GtkTreeViewColumn *column = NULL;
379 static GtkCellRenderer *renderer = NULL;
380 GtkListStore *store = NULL;
382 gboolean selected = FALSE;
383 gchar tmp1[LL_FMT_LEN], tmp2[LL_FMT_LEN];
385 printf("%s()\n", __PRETTY_FUNCTION__);
387 x = unitx - pixel2unit(3 * _draw_width);
388 y = unity + pixel2unit(3 * _draw_width);
389 unit2latlon(x, y, lat1, lon1);
391 x = unitx + pixel2unit(3 * _draw_width);
392 y = unity - pixel2unit(3 * _draw_width);
393 unit2latlon(x, y, lat2, lon2);
395 if(SQLITE_OK != sqlite3_bind_double(_stmt_select_poi, 1, lat1) ||
396 SQLITE_OK != sqlite3_bind_double(_stmt_select_poi, 2, lat2) ||
397 SQLITE_OK != sqlite3_bind_double(_stmt_select_poi, 3, lon1) ||
398 SQLITE_OK != sqlite3_bind_double(_stmt_select_poi, 4, lon2))
400 g_printerr("Failed to bind values for _stmt_select_poi\n");
404 /* Initialize store. */
405 store = gtk_list_store_new(POI_NUM_COLUMNS,
406 G_TYPE_BOOLEAN,/* Selected */
407 G_TYPE_INT, /* POI ID */
408 G_TYPE_INT, /* Category ID */
409 G_TYPE_DOUBLE, /* Latitude */
410 G_TYPE_DOUBLE, /* Longitude */
411 G_TYPE_STRING, /* Lat/Lon */
412 G_TYPE_FLOAT, /* Bearing */
413 G_TYPE_FLOAT, /* Distance */
414 G_TYPE_STRING, /* POI Label */
415 G_TYPE_STRING, /* POI Desc. */
416 G_TYPE_STRING);/* Category Label */
418 while(SQLITE_ROW == sqlite3_step(_stmt_select_poi))
421 lat = sqlite3_column_double(_stmt_select_poi, 0);
422 lon = sqlite3_column_double(_stmt_select_poi, 1);
424 format_lat_lon(lat, lon, tmp1, tmp2);
425 //lat_format(lat, tmp1);
426 //lon_format(lon, tmp2);
427 gtk_list_store_append(store, &iter);
428 gtk_list_store_set(store, &iter,
429 POI_POIID, sqlite3_column_int(_stmt_select_poi, 2),
430 POI_CATID, sqlite3_column_int(_stmt_select_poi, 5),
433 POI_LATLON, g_strdup_printf("%s, %s", tmp1, tmp2),
434 POI_LABEL, sqlite3_column_text(_stmt_select_poi, 3),
435 POI_DESC, sqlite3_column_text(_stmt_select_poi, 4),
436 POI_CLABEL, sqlite3_column_text(_stmt_select_poi, 6),
440 sqlite3_reset(_stmt_select_poi);
445 g_object_unref(G_OBJECT(store));
448 MACRO_BANNER_SHOW_INFO(_window, _("No POIs found."));
453 /* iter is still set to the most-recently added POI. */
454 gtk_tree_model_get(GTK_TREE_MODEL(store),
456 POI_POIID, &(poi->poi_id),
457 POI_CATID, &(poi->cat_id),
458 POI_LAT, &(poi->lat),
459 POI_LON, &(poi->lon),
460 POI_LABEL, &(poi->label),
461 POI_DESC, &(poi->desc),
462 POI_CLABEL, &(poi->clabel),
464 g_object_unref(G_OBJECT(store));
470 g_object_unref(G_OBJECT(store));
471 return get_nearest_poi(unitx, unity, poi);
475 /* There are at least 2 matching POI's - let the user select one. */
478 dialog = gtk_dialog_new_with_buttons(_("Select POI"),
479 GTK_WINDOW(_window), GTK_DIALOG_MODAL,
480 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
481 GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
484 gtk_window_set_default_size(GTK_WINDOW(dialog), 500, 300);
486 sw = gtk_scrolled_window_new (NULL, NULL);
487 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw),
488 GTK_SHADOW_ETCHED_IN);
489 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
491 GTK_POLICY_AUTOMATIC);
492 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
495 list = gtk_tree_view_new();
496 gtk_container_add(GTK_CONTAINER(sw), list);
498 gtk_tree_selection_set_mode(
499 gtk_tree_view_get_selection(GTK_TREE_VIEW(list)),
500 GTK_SELECTION_SINGLE);
501 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(list), TRUE);
503 renderer = gtk_cell_renderer_text_new();
504 column = gtk_tree_view_column_new_with_attributes(
505 _("Location"), renderer, "text", POI_LATLON, NULL);
506 gtk_tree_view_append_column(GTK_TREE_VIEW(list), column);
508 renderer = gtk_cell_renderer_text_new();
509 column = gtk_tree_view_column_new_with_attributes(
510 _("Label"), renderer, "text", POI_LABEL, NULL);
511 gtk_tree_view_append_column(GTK_TREE_VIEW(list), column);
513 renderer = gtk_cell_renderer_text_new();
514 column = gtk_tree_view_column_new_with_attributes(
515 _("Category"), renderer, "text", POI_CLABEL, NULL);
516 gtk_tree_view_append_column(GTK_TREE_VIEW(list), column);
519 gtk_tree_view_set_model(GTK_TREE_VIEW(list), GTK_TREE_MODEL(store));
520 g_object_unref(G_OBJECT(store));
522 gtk_widget_show_all(dialog);
524 while(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog)))
526 if(gtk_tree_selection_get_selected(
527 gtk_tree_view_get_selection(GTK_TREE_VIEW(list)),
530 gtk_tree_model_get(GTK_TREE_MODEL(store), &iter,
531 POI_POIID, &(poi->poi_id),
532 POI_CATID, &(poi->cat_id),
533 POI_LAT, &(poi->lat),
534 POI_LON, &(poi->lon),
535 POI_LABEL, &(poi->label),
536 POI_DESC, &(poi->desc),
537 POI_CLABEL, &(poi->clabel),
543 popup_error(dialog, _("Select one POI from the list."));
548 gtk_widget_hide(dialog);
550 vprintf("%s(): return %d\n", __PRETTY_FUNCTION__, selected);
555 category_delete(GtkWidget *widget, DeletePOI *dpoi)
560 printf("%s()\n", __PRETTY_FUNCTION__);
562 buffer = g_strdup_printf("%s\n\t%s\n%s",
563 _("Delete category?"),
565 _("WARNING: All POIs in that category will also be deleted!"));
566 confirm = hildon_note_new_confirmation(GTK_WINDOW(dpoi->dialog), buffer);
568 i = gtk_dialog_run(GTK_DIALOG(confirm));
569 gtk_widget_destroy(GTK_WIDGET(confirm));
571 if(i == GTK_RESPONSE_OK)
573 /* delete dpoi->poi_id */
574 if(SQLITE_OK != sqlite3_bind_int(_stmt_delete_poi_by_catid, 1,
576 SQLITE_DONE != sqlite3_step(_stmt_delete_poi_by_catid))
578 MACRO_BANNER_SHOW_INFO(dpoi->dialog, _("Error deleting POI"));
579 sqlite3_reset(_stmt_delete_poi_by_catid);
582 sqlite3_reset(_stmt_delete_poi_by_catid);
584 if(SQLITE_OK != sqlite3_bind_int(_stmt_delete_cat, 1, dpoi->id) ||
585 SQLITE_DONE != sqlite3_step(_stmt_delete_cat))
587 MACRO_BANNER_SHOW_INFO(dpoi->dialog, _("Error deleting category"));
588 sqlite3_reset(_stmt_delete_cat);
591 sqlite3_reset(_stmt_delete_cat);
595 gtk_widget_destroy(confirm);
597 vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
602 category_edit_dialog(GtkWidget *parent, gint cat_id)
604 gchar *cat_label = NULL, *cat_desc = NULL;
609 GtkWidget *txt_label;
611 GtkWidget *btn_delete = NULL;
612 GtkWidget *txt_scroll;
613 GtkWidget *chk_enabled;
614 GtkTextBuffer *desc_txt;
615 GtkTextIter begin, end;
616 gboolean results = TRUE;
617 DeletePOI dpoi = {NULL, NULL, 0};
618 printf("%s()\n", __PRETTY_FUNCTION__);
622 if(SQLITE_OK != sqlite3_bind_double(_stmt_select_cat, 1, cat_id) ||
623 SQLITE_ROW != sqlite3_step(_stmt_select_cat))
625 vprintf("%s(): return FALSE\n", __PRETTY_FUNCTION__);
626 sqlite3_reset(_stmt_select_cat);
630 cat_label = g_strdup(sqlite3_column_text(_stmt_select_cat, 0));
631 cat_desc = g_strdup(sqlite3_column_text(_stmt_select_cat, 1));
632 cat_enabled = sqlite3_column_int(_stmt_select_cat, 2);
634 sqlite3_reset(_stmt_select_cat);
636 dialog = gtk_dialog_new_with_buttons(_("Edit Category"),
637 GTK_WINDOW(parent), GTK_DIALOG_MODAL,
638 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
641 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area),
642 btn_delete = gtk_button_new_with_label(_("Delete...")));
644 dpoi.dialog = dialog;
645 dpoi.txt_label = g_strdup(cat_label);
647 dpoi.deleted = FALSE;
649 g_signal_connect(G_OBJECT(btn_delete), "clicked",
650 G_CALLBACK(category_delete), &dpoi);
652 gtk_dialog_add_button(GTK_DIALOG(dialog),
653 GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT);
658 cat_label = g_strdup("");
660 cat_desc = g_strdup("");
662 dialog = gtk_dialog_new_with_buttons(_("Add Category"),
663 GTK_WINDOW(parent), GTK_DIALOG_MODAL,
664 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
665 GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
669 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
670 table = gtk_table_new(6, 4, FALSE), TRUE, TRUE, 0);
672 gtk_table_attach(GTK_TABLE(table),
673 label = gtk_label_new(_("Label")),
674 0, 1, 0, 1, GTK_FILL, 0, 2, 4);
675 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
676 gtk_table_attach(GTK_TABLE(table),
677 txt_label = gtk_entry_new(),
678 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, 0, 2, 4);
680 gtk_table_attach(GTK_TABLE(table),
681 label = gtk_label_new(_("Description")),
682 0, 1, 1, 2, GTK_FILL, 0, 2, 4);
683 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
685 txt_scroll = gtk_scrolled_window_new(NULL, NULL);
686 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(txt_scroll),
688 gtk_table_attach(GTK_TABLE(table),
690 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 4);
692 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(txt_scroll),
693 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
695 txt_desc = gtk_text_view_new();
696 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(txt_desc), GTK_WRAP_WORD);
698 gtk_container_add(GTK_CONTAINER(txt_scroll), txt_desc);
699 gtk_widget_set_size_request(GTK_WIDGET(txt_scroll), 400, 60);
701 desc_txt = gtk_text_view_get_buffer(GTK_TEXT_VIEW(txt_desc));
703 gtk_table_attach(GTK_TABLE(table),
704 chk_enabled = gtk_check_button_new_with_label(
706 0, 2, 2, 3, GTK_EXPAND | GTK_FILL, 0, 2, 4);
709 gtk_entry_set_text(GTK_ENTRY(txt_label), cat_label);
712 gtk_text_buffer_set_text(desc_txt, cat_desc, -1);
715 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chk_enabled),
716 (cat_enabled == 1 ? TRUE : FALSE));
723 gtk_widget_show_all(dialog);
725 while(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog)))
727 if(strlen(gtk_entry_get_text(GTK_ENTRY(txt_label))))
728 cat_label = g_strdup(gtk_entry_get_text(GTK_ENTRY(txt_label)));
731 popup_error(dialog, _("Please specify a name for the category."));
735 gtk_text_buffer_get_iter_at_offset(desc_txt, &begin,0 );
736 gtk_text_buffer_get_end_iter (desc_txt, &end);
737 cat_desc = gtk_text_buffer_get_text(desc_txt, &begin, &end, TRUE);
739 cat_enabled = (gtk_toggle_button_get_active(
740 GTK_TOGGLE_BUTTON(chk_enabled)) ? 1 : 0);
745 if(SQLITE_OK != sqlite3_bind_text(_stmt_update_cat, 1, cat_label,
747 SQLITE_OK != sqlite3_bind_text(_stmt_update_cat, 2, cat_desc,
749 SQLITE_OK != sqlite3_bind_int(_stmt_update_cat, 3,cat_enabled)||
750 SQLITE_OK != sqlite3_bind_int(_stmt_update_cat, 4, cat_id) ||
751 SQLITE_DONE != sqlite3_step(_stmt_update_cat))
753 MACRO_BANNER_SHOW_INFO(parent,_("Error updating category"));
756 sqlite3_reset(_stmt_update_cat);
761 if(SQLITE_OK != sqlite3_bind_text(_stmt_insert_cat, 1, cat_label,
763 SQLITE_OK != sqlite3_bind_text(_stmt_insert_cat, 2, cat_desc,
765 SQLITE_OK != sqlite3_bind_int(_stmt_insert_cat, 3,cat_enabled)||
766 SQLITE_DONE != sqlite3_step(_stmt_insert_cat))
768 MACRO_BANNER_SHOW_INFO(parent, _("Error adding category"));
771 sqlite3_reset(_stmt_insert_cat);
776 g_free(dpoi.txt_label);
778 g_object_unref (desc_txt);
783 gtk_widget_hide(dialog);
785 vprintf("%s(): return\n", __PRETTY_FUNCTION__);
790 category_toggled(GtkCellRendererToggle *cell, gchar *path, GtkListStore *data)
793 gboolean cat_enabled;
795 printf("%s()\n", __PRETTY_FUNCTION__);
797 GtkTreeModel *model = GTK_TREE_MODEL(data);
798 if( !gtk_tree_model_get_iter_from_string(model, &iter, path) )
801 gtk_tree_model_get(model, &iter,
802 CAT_ENABLED, &cat_enabled,
808 if(SQLITE_OK != sqlite3_bind_int(_stmt_toggle_cat, 1, cat_enabled) ||
809 SQLITE_OK != sqlite3_bind_int(_stmt_toggle_cat, 2, cat_id) ||
810 SQLITE_DONE != sqlite3_step(_stmt_toggle_cat))
812 MACRO_BANNER_SHOW_INFO(_window, _("Error updating Category"));
816 gtk_list_store_set(GTK_LIST_STORE(model), &iter,
817 CAT_ENABLED, cat_enabled, -1);
821 sqlite3_reset(_stmt_toggle_cat);
823 vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
831 printf("%s()\n", __PRETTY_FUNCTION__);
833 store = gtk_list_store_new(CAT_NUM_COLUMNS,
840 while(SQLITE_ROW == sqlite3_step(_stmt_selall_cat))
842 gtk_list_store_append(store, &iter);
843 gtk_list_store_set(store, &iter,
844 CAT_ID, sqlite3_column_int(_stmt_selall_cat, 0),
845 CAT_ENABLED, sqlite3_column_int(_stmt_selall_cat, 3),
846 CAT_LABEL, sqlite3_column_text(_stmt_selall_cat, 1),
847 CAT_DESC, sqlite3_column_text(_stmt_selall_cat, 2),
848 CAT_POI_CNT, sqlite3_column_int(_stmt_selall_cat, 4),
851 sqlite3_reset(_stmt_selall_cat);
853 vprintf("%s(): return %p\n", __PRETTY_FUNCTION__, store);
858 category_add(GtkWidget *widget, PoiCategoryEditInfo *pcedit)
861 printf("%s()\n", __PRETTY_FUNCTION__);
863 if(category_edit_dialog(pcedit->dialog, 0))
865 store = generate_store();
866 gtk_tree_view_set_model(
867 GTK_TREE_VIEW(pcedit->tree_view),
868 GTK_TREE_MODEL(store));
869 g_object_unref(G_OBJECT(store));
871 vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
876 category_edit(GtkWidget *widget, PoiCategoryEditInfo *pcedit)
880 GtkTreeSelection *selection;
881 printf("%s()\n", __PRETTY_FUNCTION__);
883 store = gtk_tree_view_get_model(GTK_TREE_VIEW(pcedit->tree_view));
884 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(pcedit->tree_view));
885 if(gtk_tree_selection_get_selected(selection, &store, &iter))
888 memset(&val, 0, sizeof(val));
889 gtk_tree_model_get_value(store, &iter, 0, &val);
890 if(category_edit_dialog(pcedit->dialog, g_value_get_uint(&val)))
892 GtkListStore *new_store = generate_store();
893 gtk_tree_view_set_model(
894 GTK_TREE_VIEW(pcedit->tree_view),
895 GTK_TREE_MODEL(new_store));
896 g_object_unref(G_OBJECT(new_store));
899 vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
904 category_list_dialog(GtkWidget *parent)
906 static GtkWidget *dialog = NULL;
907 static GtkWidget *tree_view = NULL;
908 static GtkWidget *sw = NULL;
909 static GtkWidget *btn_edit = NULL;
910 static GtkWidget *btn_add = NULL;
911 static GtkTreeViewColumn *column = NULL;
912 static GtkCellRenderer *renderer = NULL;
913 static GtkListStore *store;
914 static PoiCategoryEditInfo pcedit;
915 printf("%s()\n", __PRETTY_FUNCTION__);
917 store = generate_store();
922 dialog = gtk_dialog_new_with_buttons(_("POI Categories"),
923 GTK_WINDOW(parent), GTK_DIALOG_MODAL,
924 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
927 /* Enable the help button. */
929 hildon_help_dialog_help_enable(
931 ossohelp_dialog_help_enable(
933 GTK_DIALOG(dialog), HELP_ID_POICAT, _osso);
935 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area),
936 btn_edit = gtk_button_new_with_label(_("Edit...")));
938 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area),
939 btn_add = gtk_button_new_with_label(_("Add...")));
941 sw = gtk_scrolled_window_new(NULL, NULL);
942 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (sw),
944 GTK_POLICY_AUTOMATIC);
945 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
948 tree_view = gtk_tree_view_new();
950 g_object_set(tree_view, "allow-checkbox-mode", FALSE, NULL);
951 gtk_container_add (GTK_CONTAINER (sw), tree_view);
953 gtk_tree_selection_set_mode(
954 gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view)),
955 GTK_SELECTION_SINGLE);
956 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree_view), TRUE);
958 renderer = gtk_cell_renderer_text_new();
959 column = gtk_tree_view_column_new_with_attributes(
960 _("ID"), renderer, "text", CAT_ID, NULL);
961 gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), column);
962 gtk_tree_view_column_set_max_width (column, 1);
964 renderer = gtk_cell_renderer_toggle_new();
965 g_signal_connect (renderer, "toggled",
966 G_CALLBACK (category_toggled), store);
967 column = gtk_tree_view_column_new_with_attributes(
968 _("Enabled"), renderer, "active", CAT_ENABLED, NULL);
969 gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), column);
971 renderer = gtk_cell_renderer_text_new();
972 column = gtk_tree_view_column_new_with_attributes(
973 _("Label"), renderer, "text", CAT_LABEL, NULL);
974 gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), column);
976 renderer = gtk_cell_renderer_text_new();
977 column = gtk_tree_view_column_new_with_attributes(
978 _("Description"), renderer, "text", CAT_DESC, NULL);
979 gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), column);
981 renderer = gtk_cell_renderer_text_new();
982 column = gtk_tree_view_column_new_with_attributes(
983 _("# POIs"), renderer, "text", CAT_POI_CNT, NULL);
984 gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), column);
986 gtk_window_set_default_size(GTK_WINDOW(dialog), -1, 400);
988 pcedit.dialog = dialog;
989 pcedit.tree_view = tree_view;
991 g_signal_connect(G_OBJECT(btn_edit), "clicked",
992 G_CALLBACK(category_edit), &pcedit);
994 g_signal_connect(G_OBJECT(btn_add), "clicked",
995 G_CALLBACK(category_add), &pcedit);
997 gtk_tree_view_set_model(GTK_TREE_VIEW(tree_view), GTK_TREE_MODEL(store));
998 g_object_unref(G_OBJECT(store));
1000 gtk_widget_show_all(dialog);
1002 while(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog)))
1007 gtk_widget_destroy(dialog);
1009 vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1014 poi_delete(GtkWidget *widget, DeletePOI *dpoi)
1019 printf("%s()\n", __PRETTY_FUNCTION__);
1021 buffer = g_strdup_printf("%s\n%s", _("Delete POI?"), dpoi->txt_label);
1022 confirm = hildon_note_new_confirmation(GTK_WINDOW(dpoi->dialog), buffer);
1024 i = gtk_dialog_run(GTK_DIALOG(confirm));
1025 gtk_widget_destroy(GTK_WIDGET(confirm));
1027 if(i == GTK_RESPONSE_OK)
1029 if(SQLITE_OK != sqlite3_bind_int(_stmt_delete_poi, 1, dpoi->id) ||
1030 SQLITE_DONE != sqlite3_step(_stmt_delete_poi))
1032 MACRO_BANNER_SHOW_INFO(dpoi->dialog, _("Error deleting POI"));
1036 dpoi->deleted = TRUE;
1037 gtk_widget_hide(dpoi->dialog);
1040 sqlite3_reset(_stmt_delete_poi);
1043 vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1048 poi_populate_categories(GtkListStore *store, gint cat_id,
1049 GtkTreeIter *out_active)
1051 gboolean has_active = FALSE;
1052 printf("%s()\n", __PRETTY_FUNCTION__);
1054 gtk_list_store_clear(store);
1056 while(SQLITE_ROW == sqlite3_step(_stmt_selall_cat))
1059 gint cid = sqlite3_column_int(_stmt_selall_cat, 0);
1060 const gchar *clab = sqlite3_column_text(_stmt_selall_cat, 1);
1062 gtk_list_store_append(store, &iter);
1063 gtk_list_store_set(store, &iter, 0, cid, 1, clab, -1);
1065 if(cid == cat_id || !has_active)
1072 sqlite3_reset(_stmt_selall_cat);
1074 vprintf("%s(): return\n", __PRETTY_FUNCTION__);
1079 poi_edit_cat(GtkWidget *widget, PoiCategoryEditInfo *data)
1081 printf("%s()\n", __PRETTY_FUNCTION__);
1082 if(category_list_dialog(data->dialog))
1085 if(poi_populate_categories(GTK_LIST_STORE(gtk_combo_box_get_model(
1086 GTK_COMBO_BOX(data->cmb_category))),
1087 data->cat_id, &active))
1089 gtk_combo_box_set_active_iter(
1090 GTK_COMBO_BOX(data->cmb_category), &active);
1093 vprintf("%s(): return\n", __PRETTY_FUNCTION__);
1098 poi_create_cat_combo()
1100 GtkWidget *cmb_category;
1101 GtkTreeModel *model;
1102 printf("%s()\n", __PRETTY_FUNCTION__);
1104 model = GTK_TREE_MODEL(gtk_list_store_new(2,
1105 G_TYPE_INT, /* Category ID */
1106 G_TYPE_STRING)); /* Category Label */
1107 cmb_category = gtk_combo_box_new_with_model(model);
1108 g_object_unref(model);
1110 /* Set up the view for the combo box. */
1112 GtkCellRenderer *renderer;
1114 renderer = gtk_cell_renderer_text_new();
1115 gtk_cell_layout_pack_start(
1116 GTK_CELL_LAYOUT(cmb_category), renderer, TRUE);
1117 gtk_cell_layout_set_attributes(
1118 GTK_CELL_LAYOUT(cmb_category), renderer, "text", 1, NULL);
1120 poi_populate_categories(GTK_LIST_STORE(gtk_combo_box_get_model(
1121 GTK_COMBO_BOX(cmb_category))), -1, &active);
1123 vprintf("%s(): return\n", __PRETTY_FUNCTION__);
1124 return cmb_category;
1128 poi_add_dialog(GtkWidget *parent, gint unitx, gint unity)
1131 static GtkWidget *dialog;
1132 static GtkWidget *table;
1133 static GtkWidget *label;
1134 static GtkWidget *txt_label;
1135 static GtkWidget *txt_lat;
1136 static GtkWidget *txt_lon;
1137 static GtkWidget *cmb_category;
1138 static GtkWidget *txt_desc;
1139 static GtkWidget *btn_catedit;
1140 static GtkWidget *hbox;
1141 static GtkWidget *txt_scroll;
1142 static GtkTextBuffer *desc_txt;
1143 static GtkTextIter begin, end;
1144 static DeletePOI dpoi = {NULL, NULL, 0};
1145 static PoiCategoryEditInfo pcedit;
1146 static int last_deg_format = 0;
1148 printf("%s()\n", __PRETTY_FUNCTION__);
1150 unit2latlon(unitx, unity, poi.lat, poi.lon);
1153 gint fallback_deg_format = _degformat;
1155 if(!coord_system_check_lat_lon (poi.lat, poi.lon, &fallback_deg_format))
1157 last_deg_format = _degformat;
1158 _degformat = fallback_deg_format;
1160 if(dialog != NULL) gtk_widget_destroy(dialog);
1163 else if(_degformat != last_deg_format)
1165 last_deg_format = _degformat;
1167 if(dialog != NULL) gtk_widget_destroy(dialog);
1176 dialog = gtk_dialog_new_with_buttons(_("Add POI"),
1177 GTK_WINDOW(parent), GTK_DIALOG_MODAL,
1178 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
1179 GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
1182 /* Set the lat/lon strings. */
1183 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
1184 table = gtk_table_new(6, 4, FALSE), TRUE, TRUE, 0);
1186 gtk_table_attach(GTK_TABLE(table),
1187 label = gtk_label_new(DEG_FORMAT_ENUM_TEXT[_degformat].short_field_1),
1188 0, 1, 0, 1, GTK_FILL, 0, 2, 0);
1189 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1190 gtk_table_attach(GTK_TABLE(table),
1191 txt_lat = gtk_entry_new(),
1192 1, (DEG_FORMAT_ENUM_TEXT[_degformat].field_2_in_use ? 2 : 4),
1193 0, 1, GTK_FILL, 0, 2, 0);
1195 if(DEG_FORMAT_ENUM_TEXT[_degformat].field_2_in_use )
1197 gtk_table_attach(GTK_TABLE(table),
1198 label = gtk_label_new(DEG_FORMAT_ENUM_TEXT[_degformat].short_field_2),
1199 2, 3, 0, 1, GTK_FILL, 0, 2, 0);
1200 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1201 gtk_table_attach(GTK_TABLE(table),
1202 txt_lon = gtk_entry_new(),
1203 3, 4, 0, 1, GTK_FILL, 0, 2, 0);
1206 gtk_table_attach(GTK_TABLE(table),
1207 label = gtk_label_new(_("Label")),
1208 0, 1, 1, 2, GTK_FILL, 0, 2, 0);
1209 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1210 gtk_table_attach(GTK_TABLE(table),
1211 txt_label = gtk_entry_new(),
1212 1, 4, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 0);
1214 gtk_table_attach(GTK_TABLE(table),
1215 label = gtk_label_new(_("Category")),
1216 0, 1, 3, 4, GTK_FILL, 0, 2, 0);
1217 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1218 gtk_table_attach(GTK_TABLE(table),
1219 hbox = gtk_hbox_new(FALSE, 4),
1220 1, 4, 3, 4, GTK_EXPAND | GTK_FILL, 0, 2, 0);
1221 gtk_box_pack_start(GTK_BOX(hbox),
1222 cmb_category = poi_create_cat_combo(),
1225 gtk_box_pack_start(GTK_BOX(hbox),
1226 btn_catedit = gtk_button_new_with_label(
1227 _("Edit Categories...")),
1230 gtk_table_attach(GTK_TABLE(table),
1231 label = gtk_label_new(_("Description")),
1232 0, 1, 5, 6, GTK_FILL, GTK_FILL, 2, 0);
1233 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.0f);
1235 txt_scroll = gtk_scrolled_window_new(NULL, NULL);
1236 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(txt_scroll),
1238 gtk_table_attach(GTK_TABLE(table),
1240 1, 4, 5, 6, GTK_EXPAND | GTK_FILL, 0, 2, 0);
1242 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(txt_scroll),
1243 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1245 txt_desc = gtk_text_view_new ();
1246 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(txt_desc), GTK_WRAP_WORD);
1248 gtk_container_add(GTK_CONTAINER(txt_scroll), txt_desc);
1249 gtk_widget_set_size_request(GTK_WIDGET(txt_scroll), 550, 120);
1251 desc_txt = gtk_text_view_get_buffer(GTK_TEXT_VIEW (txt_desc));
1253 g_signal_connect(G_OBJECT(btn_catedit), "clicked",
1254 G_CALLBACK(poi_edit_cat), &pcedit);
1260 poi.desc = g_strdup("");
1264 gchar tmp1[LL_FMT_LEN], tmp2[LL_FMT_LEN];
1266 format_lat_lon(poi.lat, poi.lon, tmp1, tmp2);
1267 //lat_format(poi.lat, tmp1);
1268 //lon_format(poi.lon, tmp2);
1270 gtk_entry_set_text(GTK_ENTRY(txt_lat), tmp1);
1273 gtk_entry_set_text(GTK_ENTRY(txt_lon), tmp2);
1277 if(SQLITE_ROW == sqlite3_step(_stmt_nextlabel_poi))
1278 poi.label = g_strdup_printf("Point%06d",
1279 sqlite3_column_int(_stmt_nextlabel_poi, 0));
1281 poi.label = g_strdup("");
1282 sqlite3_reset(_stmt_nextlabel_poi);
1283 gtk_entry_set_text(GTK_ENTRY(txt_label), poi.label);
1286 gtk_text_buffer_set_text(desc_txt, "", -1);
1292 gboolean had_cat_id = FALSE;
1294 if(gtk_combo_box_get_active_iter(
1295 GTK_COMBO_BOX(cmb_category), &iter))
1298 gtk_combo_box_get_model(GTK_COMBO_BOX(cmb_category)),&iter,
1303 gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(
1304 GTK_COMBO_BOX(cmb_category))));
1305 if(poi_populate_categories(GTK_LIST_STORE(gtk_combo_box_get_model(
1306 GTK_COMBO_BOX(cmb_category))), cat_id, &iter)
1309 gtk_combo_box_set_active_iter(GTK_COMBO_BOX(cmb_category), &iter);
1313 pcedit.dialog = dialog;
1314 pcedit.cmb_category = cmb_category;
1315 pcedit.cat_id = poi.cat_id;
1317 gtk_widget_show_all(dialog);
1319 while(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog)))
1322 const gchar *lat, *lon = NULL;
1324 lat = gtk_entry_get_text(GTK_ENTRY(txt_lat));
1327 lon = gtk_entry_get_text(GTK_ENTRY(txt_lon));
1329 if(!parse_coords(lat, lon, &poi.lat, &poi.lon))
1331 popup_error(dialog, _("Invalid Coordinate specified"));
1335 if(strlen(gtk_entry_get_text(GTK_ENTRY(txt_label))))
1339 poi.label = g_strdup(gtk_entry_get_text(GTK_ENTRY(txt_label)));
1343 popup_error(dialog, _("Please specify a name."));
1347 if(!gtk_combo_box_get_active_iter(
1348 GTK_COMBO_BOX(cmb_category), &iter))
1350 popup_error(dialog, _("Please specify a category."));
1354 gtk_text_buffer_get_iter_at_offset(desc_txt, &begin,0 );
1355 gtk_text_buffer_get_end_iter (desc_txt, &end);
1358 poi.desc = gtk_text_buffer_get_text(desc_txt, &begin, &end, TRUE);
1363 gtk_combo_box_get_model(GTK_COMBO_BOX(cmb_category)), &iter,
1369 if(SQLITE_OK != sqlite3_bind_double(_stmt_insert_poi, 1, poi.lat)
1370 || SQLITE_OK != sqlite3_bind_double(_stmt_insert_poi, 2, poi.lon)
1371 || SQLITE_OK != sqlite3_bind_text(_stmt_insert_poi, 3, poi.label,
1373 || SQLITE_OK != sqlite3_bind_text(_stmt_insert_poi, 4, poi.desc,
1375 || SQLITE_OK != sqlite3_bind_int(_stmt_insert_poi, 5, poi.cat_id)
1376 || SQLITE_DONE != sqlite3_step(_stmt_insert_poi))
1378 MACRO_BANNER_SHOW_INFO(parent, _("Error adding POI"));
1381 sqlite3_reset(_stmt_insert_poi);
1389 g_free(dpoi.txt_label);
1393 gtk_widget_hide(dialog);
1395 _degformat = last_deg_format;
1397 vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1398 return !dpoi.deleted;
1402 poi_view_dialog(GtkWidget *parent, PoiInfo *poi)
1405 static GtkWidget *dialog;
1406 static GtkWidget *table;
1407 static GtkWidget *label;
1408 static GtkWidget *txt_label;
1409 static GtkWidget *txt_lat;
1410 static GtkWidget *txt_lon;
1411 static GtkWidget *cmb_category;
1412 static GtkWidget *txt_desc;
1413 static GtkWidget *btn_delete = NULL;
1414 static GtkWidget *btn_catedit;
1415 static GtkWidget *hbox;
1416 static GtkWidget *txt_scroll;
1417 static GtkTextBuffer *desc_txt;
1418 static GtkTextIter begin, end;
1419 static DeletePOI dpoi = {NULL, NULL, 0};
1420 static PoiCategoryEditInfo pcedit;
1421 static int last_deg_format = 0;
1423 printf("%s()\n", __PRETTY_FUNCTION__);
1425 gint fallback_deg_format = _degformat;
1427 if(!coord_system_check_lat_lon (poi->lat, poi->lon, &fallback_deg_format))
1429 last_deg_format = _degformat;
1430 _degformat = fallback_deg_format;
1432 if(dialog != NULL) gtk_widget_destroy(dialog);
1435 else if(_degformat != last_deg_format)
1437 last_deg_format = _degformat;
1439 if(dialog != NULL) gtk_widget_destroy(dialog);
1445 dialog = gtk_dialog_new_with_buttons(_("Edit POI"),
1446 GTK_WINDOW(parent), GTK_DIALOG_MODAL,
1447 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
1450 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area),
1451 btn_delete = gtk_button_new_with_label(_("Delete...")));
1453 gtk_dialog_add_button(GTK_DIALOG(dialog),
1454 GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT);
1456 /* Set the lat/lon strings. */
1457 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
1458 table = gtk_table_new(6, 4, FALSE), TRUE, TRUE, 0);
1460 gtk_table_attach(GTK_TABLE(table),
1461 label = gtk_label_new(DEG_FORMAT_ENUM_TEXT[_degformat].short_field_1),
1462 0, 1, 0, 1, GTK_FILL, 0, 2, 0);
1463 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1464 gtk_table_attach(GTK_TABLE(table),
1465 txt_lat = gtk_entry_new(),
1466 1, 2, 0, 1, GTK_FILL, 0, 2, 0);
1468 if(DEG_FORMAT_ENUM_TEXT[_degformat].field_2_in_use)
1470 gtk_table_attach(GTK_TABLE(table),
1471 label = gtk_label_new(DEG_FORMAT_ENUM_TEXT[_degformat].short_field_2),
1472 2, 3, 0, 1, GTK_FILL, 0, 2, 0);
1473 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1474 gtk_table_attach(GTK_TABLE(table),
1475 txt_lon = gtk_entry_new(),
1476 3, 4, 0, 1, GTK_FILL, 0, 2, 0);
1479 gtk_table_attach(GTK_TABLE(table),
1480 label = gtk_label_new(_("Label")),
1481 0, 1, 1, 2, GTK_FILL, 0, 2, 0);
1482 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1483 gtk_table_attach(GTK_TABLE(table),
1484 txt_label = gtk_entry_new(),
1485 1, 4, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 0);
1487 gtk_table_attach(GTK_TABLE(table),
1488 label = gtk_label_new(_("Category")),
1489 0, 1, 3, 4, GTK_FILL, 0, 2, 0);
1490 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
1491 gtk_table_attach(GTK_TABLE(table),
1492 hbox = gtk_hbox_new(FALSE, 4),
1493 1, 4, 3, 4, GTK_EXPAND | GTK_FILL, 0, 2, 0);
1494 gtk_box_pack_start(GTK_BOX(hbox),
1495 cmb_category = poi_create_cat_combo(),
1498 gtk_box_pack_start(GTK_BOX(hbox),
1499 btn_catedit = gtk_button_new_with_label(
1500 _("Edit Categories...")),
1503 gtk_table_attach(GTK_TABLE(table),
1504 label = gtk_label_new(_("Description")),
1505 0, 1, 5, 6, GTK_FILL, GTK_FILL, 2, 0);
1506 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.0f);
1508 txt_scroll = gtk_scrolled_window_new(NULL, NULL);
1509 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(txt_scroll),
1511 gtk_table_attach(GTK_TABLE(table),
1513 1, 4, 5, 6, GTK_EXPAND | GTK_FILL, 0, 2, 0);
1515 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(txt_scroll),
1516 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1518 txt_desc = gtk_text_view_new ();
1519 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(txt_desc), GTK_WRAP_WORD);
1521 gtk_container_add(GTK_CONTAINER(txt_scroll), txt_desc);
1522 gtk_widget_set_size_request(GTK_WIDGET(txt_scroll), 550, 120);
1524 desc_txt = gtk_text_view_get_buffer (GTK_TEXT_VIEW (txt_desc));
1526 g_signal_connect(G_OBJECT(btn_delete), "clicked",
1527 G_CALLBACK(poi_delete), &dpoi);
1529 g_signal_connect(G_OBJECT(btn_catedit), "clicked",
1530 G_CALLBACK(poi_edit_cat), &pcedit);
1533 dpoi.dialog = dialog;
1534 dpoi.txt_label = g_strdup(poi->label);
1535 dpoi.id = poi->poi_id;
1536 dpoi.deleted = FALSE;
1540 gchar tmp1[LL_FMT_LEN], tmp2[LL_FMT_LEN];
1542 format_lat_lon(poi->lat, poi->lon, tmp1, tmp2);
1543 //lat_format(poi->lat, tmp1);
1544 //lon_format(poi->lon, tmp2);
1546 gtk_entry_set_text(GTK_ENTRY(txt_lat), tmp1);
1548 if(DEG_FORMAT_ENUM_TEXT[_degformat].field_2_in_use)
1549 gtk_entry_set_text(GTK_ENTRY(txt_lon), tmp2);
1551 gtk_entry_set_text(GTK_ENTRY(txt_lon), g_strdup(""));
1555 gtk_entry_set_text(GTK_ENTRY(txt_label), poi->label);
1558 gtk_text_buffer_set_text(desc_txt, poi->desc, -1);
1561 gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(
1562 GTK_COMBO_BOX(cmb_category))));
1563 if(poi_populate_categories(GTK_LIST_STORE(gtk_combo_box_get_model(
1564 GTK_COMBO_BOX(cmb_category))), poi->cat_id, &iter))
1565 gtk_combo_box_set_active_iter(GTK_COMBO_BOX(cmb_category), &iter);
1567 /* Connect Signals */
1568 pcedit.dialog = dialog;
1569 pcedit.cmb_category = cmb_category;
1570 pcedit.cat_id = poi->cat_id;
1572 gtk_widget_show_all(dialog);
1574 while(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog)))
1576 const gchar *text_lat, *text_lon;
1578 text_lat = gtk_entry_get_text(GTK_ENTRY(txt_lat));
1579 text_lon = gtk_entry_get_text(GTK_ENTRY(txt_lon));
1581 if(!parse_coords(text_lat, text_lon, &poi->lat, &poi->lon))
1583 popup_error(dialog, _("Invalid coordinate specified"));
1588 if(strlen(gtk_entry_get_text(GTK_ENTRY(txt_label))))
1592 poi->label = g_strdup(gtk_entry_get_text(GTK_ENTRY(txt_label)));
1596 popup_error(dialog, _("Please specify a name."));
1600 if(!gtk_combo_box_get_active_iter(
1601 GTK_COMBO_BOX(cmb_category), &iter))
1603 popup_error(dialog, _("Please specify a category."));
1607 gtk_text_buffer_get_iter_at_offset(desc_txt, &begin,0 );
1608 gtk_text_buffer_get_end_iter (desc_txt, &end);
1611 poi->desc = gtk_text_buffer_get_text(desc_txt, &begin, &end, TRUE);
1614 g_free(poi->clabel);
1616 gtk_combo_box_get_model(GTK_COMBO_BOX(cmb_category)), &iter,
1622 if(SQLITE_OK != sqlite3_bind_double(
1623 _stmt_update_poi, 1, poi->lat) ||
1624 SQLITE_OK != sqlite3_bind_double(
1625 _stmt_update_poi, 2, poi->lon) ||
1626 SQLITE_OK != sqlite3_bind_text(_stmt_update_poi, 3, poi->label,
1627 -1, SQLITE_STATIC) ||
1628 SQLITE_OK != sqlite3_bind_text(_stmt_update_poi, 4, poi->desc,
1629 -1, SQLITE_STATIC) ||
1630 SQLITE_OK != sqlite3_bind_int(
1631 _stmt_update_poi, 5, poi->cat_id) ||
1632 SQLITE_OK != sqlite3_bind_int(
1633 _stmt_update_poi, 6, poi->poi_id) ||
1634 SQLITE_DONE != sqlite3_step(_stmt_update_poi))
1636 MACRO_BANNER_SHOW_INFO(parent, _("Error updating POI"));
1639 sqlite3_reset(_stmt_update_poi);
1645 g_free(dpoi.txt_label);
1649 gtk_widget_hide(dialog); /* Destroying causes a crash.... ??? */
1651 _degformat = last_deg_format;
1653 vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1654 return !dpoi.deleted;
1658 poi_list_insert(GtkWidget *parent, GList *poi_list, GtkComboBox *cmb_category)
1660 gint default_cat_id;
1661 gchar *default_cat_label;
1662 gint num_inserts = 0;
1665 printf("%s()\n", __PRETTY_FUNCTION__);
1667 /* Get defaults from the given GtkComboBox */
1668 if(!gtk_combo_box_get_active_iter(
1669 GTK_COMBO_BOX(cmb_category), &iter))
1671 vprintf("%s(): return 0\n", __PRETTY_FUNCTION__);
1675 gtk_combo_box_get_model(GTK_COMBO_BOX(cmb_category)),
1678 1, &default_cat_label,
1681 /* Iterate through the data model and import as desired. */
1682 for(curr = poi_list; curr; )
1684 PoiInfo *poi = curr->data;
1686 ( SQLITE_OK != sqlite3_bind_double(_stmt_insert_poi, 1, poi->lat)
1687 || SQLITE_OK != sqlite3_bind_double(_stmt_insert_poi, 2, poi->lon)
1688 || SQLITE_OK != sqlite3_bind_text(_stmt_insert_poi, 3, poi->label,
1690 || SQLITE_OK != sqlite3_bind_text(_stmt_insert_poi, 4, poi->desc,
1692 || SQLITE_OK != sqlite3_bind_int(_stmt_insert_poi, 5,
1693 poi->cat_id = default_cat_id)
1694 || SQLITE_DONE != sqlite3_step(_stmt_insert_poi)
1698 GList *tmp = curr->next;
1703 g_slice_free(PoiInfo, poi);
1704 poi_list = g_list_delete_link(poi_list, curr);
1711 if(default_cat_label)
1712 poi->clabel = g_strdup(default_cat_label);
1713 poi->poi_id = sqlite3_last_insert_rowid(_poi_db);
1716 sqlite3_reset(_stmt_insert_poi);
1721 gchar buffer[BUFFER_SIZE];
1723 snprintf(buffer, sizeof(buffer), "%d %s", num_inserts,
1724 _("POIs were added to the POI database. The following screen will "
1725 "allow you to modify or delete any of the new POIs."));
1726 popup_error(parent, buffer);
1730 popup_error(parent, _("No POIs were found."));
1733 if(default_cat_label)
1734 g_free(default_cat_label);
1736 vprintf("%s(): return %d\n", __PRETTY_FUNCTION__, num_inserts);
1741 poi_list_free(GList *poi_list)
1744 printf("%s()\n", __PRETTY_FUNCTION__);
1746 for(curr = poi_list; curr; curr = curr->next)
1748 PoiInfo *poi_info = curr->data;
1752 g_free(poi_info->label);
1754 g_free(poi_info->desc);
1755 if(poi_info->clabel)
1756 g_free(poi_info->clabel);
1757 g_slice_free(PoiInfo, poi_info);
1761 g_list_free(poi_list);
1763 vprintf("%s(): return\n", __PRETTY_FUNCTION__);
1767 poi_list_bearing_cell_data_func(
1768 GtkTreeViewColumn *tree_column,
1769 GtkCellRenderer *cell,
1770 GtkTreeModel *tree_model,
1775 vprintf("%s()\n", __PRETTY_FUNCTION__);
1777 gtk_tree_model_get(tree_model, iter, POI_BEARING, &f, -1);
1778 snprintf(buffer, sizeof(buffer), "%.1f", f);
1779 g_object_set(cell, "text", buffer, NULL);
1781 vprintf("%s(): return\n", __PRETTY_FUNCTION__);
1785 poi_list_distance_cell_data_func(
1786 GtkTreeViewColumn *tree_column,
1787 GtkCellRenderer *cell,
1788 GtkTreeModel *tree_model,
1793 vprintf("%s()\n", __PRETTY_FUNCTION__);
1795 gtk_tree_model_get(tree_model, iter, POI_DISTANCE, &f, -1);
1796 snprintf(buffer, sizeof(buffer), "%.2f", f);
1797 g_object_set(cell, "text", buffer, NULL);
1799 vprintf("%s(): return\n", __PRETTY_FUNCTION__);
1803 poi_list_row_selected(GtkCellRendererToggle *renderer,
1804 gchar *path_string, GtkTreeModel *tree_model)
1807 vprintf("%s()\n", __PRETTY_FUNCTION__);
1809 if(gtk_tree_model_get_iter_from_string(tree_model, &iter, path_string))
1812 gtk_tree_model_get(tree_model, &iter, POI_SELECTED, &old_value, -1);
1813 gtk_list_store_set(GTK_LIST_STORE(tree_model), &iter,
1814 POI_SELECTED, !old_value,
1818 vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1823 poi_list_set_category(GtkWidget *widget, PoiListInfo *pli)
1825 static GtkWidget *dialog = NULL;
1826 static GtkWidget *cmb_category = NULL;
1827 static GtkWidget *btn_catedit = NULL;
1828 static PoiCategoryEditInfo pcedit;
1829 printf("%s()\n", __PRETTY_FUNCTION__);
1836 dialog = gtk_dialog_new_with_buttons(_("Set Category..."),
1837 GTK_WINDOW(pli->dialog2), GTK_DIALOG_MODAL,
1838 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
1839 GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
1842 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
1843 hbox = gtk_hbox_new(FALSE, 4), FALSE, FALSE, 4);
1845 gtk_box_pack_start(GTK_BOX(hbox),
1846 label = gtk_label_new(_("Category")),
1849 gtk_box_pack_start(GTK_BOX(hbox),
1850 cmb_category = poi_create_cat_combo(),
1853 gtk_box_pack_start(GTK_BOX(hbox),
1854 btn_catedit = gtk_button_new_with_label(
1855 _("Edit Categories...")),
1858 /* Connect Signals */
1859 pcedit.dialog = dialog;
1860 pcedit.cmb_category = cmb_category;
1862 g_signal_connect(G_OBJECT(btn_catedit), "clicked",
1863 G_CALLBACK(poi_edit_cat), &pcedit);
1866 gtk_widget_show_all(dialog);
1868 while(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog)))
1871 GtkListStore *store;
1873 const gchar *cat_label;
1875 /* Get the text of the chosen category. */
1876 if(!gtk_combo_box_get_active_iter(
1877 GTK_COMBO_BOX(cmb_category), &iter))
1879 popup_error(dialog, _("Please specify a category."));
1884 gtk_combo_box_get_model(GTK_COMBO_BOX(cmb_category)),
1890 /* Iterate through the data store and categorize as desired. */
1891 store = GTK_LIST_STORE(gtk_tree_view_get_model(
1892 GTK_TREE_VIEW(pli->tree_view)));
1893 if(gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter)) do
1898 memset(&poi, 0, sizeof(poi));
1900 gtk_tree_model_get(GTK_TREE_MODEL(store), &iter,
1901 POI_SELECTED, &selected,
1902 POI_POIID, &(poi.poi_id),
1903 POI_LAT, &(poi.lat),
1904 POI_LON, &(poi.lon),
1905 POI_LABEL, &(poi.label),
1906 POI_DESC, &(poi.desc),
1911 gtk_list_store_set(store, &iter,
1913 POI_CLABEL, cat_label,
1916 if(SQLITE_OK != sqlite3_bind_double(
1917 _stmt_update_poi, 1, poi.lat) ||
1918 SQLITE_OK != sqlite3_bind_double(
1919 _stmt_update_poi, 2, poi.lon) ||
1920 SQLITE_OK != sqlite3_bind_text(_stmt_update_poi,
1921 3, poi.label, -1, SQLITE_STATIC) ||
1922 SQLITE_OK != sqlite3_bind_text(_stmt_update_poi,
1923 4, poi.desc, -1, SQLITE_STATIC) ||
1924 SQLITE_OK != sqlite3_bind_int(
1925 _stmt_update_poi, 5, cat_id) ||
1926 SQLITE_OK != sqlite3_bind_int(
1927 _stmt_update_poi, 6, poi.poi_id) ||
1928 SQLITE_DONE != sqlite3_step(_stmt_update_poi))
1930 MACRO_BANNER_SHOW_INFO(pli->dialog2,
1931 _("Error updating POI"));
1933 sqlite3_reset(_stmt_update_poi);
1935 } while(gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter));
1941 gtk_widget_hide(dialog);
1943 vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1948 poi_list_select_all(GtkTreeViewColumn *column, PoiListInfo *pli)
1951 GtkListStore *store;
1952 printf("%s()\n", __PRETTY_FUNCTION__);
1954 /* Iterate through the data store and select as desired. */
1955 store = GTK_LIST_STORE(gtk_tree_view_get_model(
1956 GTK_TREE_VIEW(pli->tree_view)));
1957 if(gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter)) do
1959 gtk_list_store_set(store, &iter,
1960 POI_SELECTED, pli->select_all,
1962 } while(gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter));
1964 pli->select_all = !pli->select_all;
1966 vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
1971 poi_list_view(GtkWidget *widget, PoiListInfo *pli)
1974 GtkTreeSelection *selection;
1975 GtkListStore *store;
1976 printf("%s()\n", __PRETTY_FUNCTION__);
1978 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(pli->tree_view));
1979 store = GTK_LIST_STORE(gtk_tree_view_get_model(
1980 GTK_TREE_VIEW(pli->tree_view)));
1982 /* Iterate through the data store and import as desired. */
1983 if(gtk_tree_selection_get_selected(selection, NULL, &iter))
1986 memset(&poi, 0, sizeof(poi));
1988 gtk_tree_model_get(GTK_TREE_MODEL(store), &iter,
1989 POI_POIID, &(poi.poi_id),
1990 POI_CATID, &(poi.cat_id),
1991 POI_LAT, &(poi.lat),
1992 POI_LON, &(poi.lon),
1993 POI_LABEL, &(poi.label),
1994 POI_DESC, &(poi.desc),
1995 POI_CLABEL, &(poi.clabel),
1998 if(poi_view_dialog(pli->dialog, &poi))
2000 gtk_list_store_set(store, &iter,
2001 POI_POIID, poi.poi_id,
2002 POI_CATID, poi.cat_id,
2005 POI_LABEL, poi.label,
2007 POI_CLABEL, poi.clabel,
2012 /* POI was deleted. */
2013 gtk_list_store_remove(store, &iter);
2017 vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
2022 poi_list_row_activated(GtkTreeView *tree_view, GtkTreePath *path,
2023 GtkTreeViewColumn *column, PoiListInfo *pli)
2025 printf("%s()\n", __PRETTY_FUNCTION__);
2027 if(column != pli->select_column)
2028 poi_list_view(GTK_WIDGET(tree_view), pli);
2030 vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
2034 poi_list_goto(GtkWidget *widget, PoiListInfo *pli)
2037 GtkTreeSelection *selection;
2038 GtkListStore *store;
2039 printf("%s()\n", __PRETTY_FUNCTION__);
2041 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(pli->tree_view));
2042 store = GTK_LIST_STORE(gtk_tree_view_get_model(
2043 GTK_TREE_VIEW(pli->tree_view)));
2045 /* Iterate through the data store and import as desired. */
2046 if(gtk_tree_selection_get_selected(selection, NULL, &iter))
2051 gtk_tree_model_get(GTK_TREE_MODEL(store), &iter,
2056 latlon2unit(lat, lon, unit.unitx, unit.unity);
2058 if(_center_mode > 0)
2059 gtk_check_menu_item_set_active(
2060 GTK_CHECK_MENU_ITEM(_menu_view_ac_none_item), TRUE);
2062 map_center_unit(unit);
2065 vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
2070 poi_list_delete(GtkWidget *widget, PoiListInfo *pli)
2073 printf("%s()\n", __PRETTY_FUNCTION__);
2075 confirm = hildon_note_new_confirmation(
2076 GTK_WINDOW(pli->dialog2), _("Delete selected POI?"));
2078 if(GTK_RESPONSE_OK == gtk_dialog_run(GTK_DIALOG(confirm)))
2081 GtkListStore *store;
2082 gboolean already_next;
2083 gboolean must_iterate;;
2085 /* Iterate through the data store and import as desired. */
2086 store = GTK_LIST_STORE(gtk_tree_view_get_model(
2087 GTK_TREE_VIEW(pli->tree_view)));
2088 if(gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter)) do
2091 must_iterate = TRUE;
2092 already_next = FALSE;
2094 gtk_tree_model_get(GTK_TREE_MODEL(store), &iter,
2095 POI_SELECTED, &selected,
2101 if(SQLITE_OK != sqlite3_bind_int(_stmt_delete_poi, 1, poi_id)
2102 || SQLITE_DONE != sqlite3_step(_stmt_delete_poi))
2104 MACRO_BANNER_SHOW_INFO(pli->dialog2,
2105 _("Error deleting POI"));
2109 already_next = gtk_list_store_remove(store, &iter);
2110 must_iterate = FALSE;
2112 sqlite3_reset(_stmt_delete_poi);
2114 } while(already_next || (must_iterate
2115 && gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter)));
2120 gtk_widget_destroy(confirm);
2122 vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
2127 poi_list_export_gpx(GtkWidget *widget, PoiListInfo *pli)
2129 GnomeVFSHandle *handle;
2130 printf("%s()\n", __PRETTY_FUNCTION__);
2132 if(display_open_file(GTK_WINDOW(pli->dialog2), NULL, &handle, NULL,
2133 NULL, NULL, GTK_FILE_CHOOSER_ACTION_SAVE))
2135 gint num_exported = gpx_poi_write(
2136 gtk_tree_view_get_model(GTK_TREE_VIEW(pli->tree_view)), handle);
2137 if(num_exported >= 0)
2140 snprintf(buffer, sizeof(buffer), "%d %s\n", num_exported,
2141 _("POIs Exported"));
2142 MACRO_BANNER_SHOW_INFO(pli->dialog2, buffer);
2145 popup_error(pli->dialog2, _("Error writing GPX file."));
2146 gnome_vfs_close(handle);
2149 vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
2154 poi_list_manage_checks(GtkWidget *widget, PoiListInfo *pli)
2156 GtkWidget *btn_category;
2157 GtkWidget *btn_delete;
2158 GtkWidget *btn_export_gpx;
2160 printf("%s()\n", __PRETTY_FUNCTION__);
2162 pli->dialog2 = gtk_dialog_new_with_buttons(_("Checked POI Actions..."),
2163 GTK_WINDOW(pli->dialog), GTK_DIALOG_MODAL,
2166 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pli->dialog2)->vbox),
2167 gtk_label_new(_("Select an operation to perform\n"
2168 "on the POIs that you checked\n"
2169 "in the POI list.")),
2172 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pli->dialog2)->vbox),
2173 btn_category = gtk_button_new_with_label(_("Set Category...")),
2176 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pli->dialog2)->vbox),
2177 btn_delete = gtk_button_new_with_label(_("Delete...")),
2180 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pli->dialog2)->vbox),
2181 btn_export_gpx = gtk_button_new_with_label(
2182 _("Export to GPX...")),
2185 gtk_dialog_add_button(GTK_DIALOG(pli->dialog2),
2186 GTK_STOCK_CLOSE, GTK_RESPONSE_ACCEPT);
2188 g_signal_connect(G_OBJECT(btn_category), "clicked",
2189 G_CALLBACK(poi_list_set_category), pli);
2191 g_signal_connect(G_OBJECT(btn_delete), "clicked",
2192 G_CALLBACK(poi_list_delete), pli);
2194 g_signal_connect(G_OBJECT(btn_export_gpx), "clicked",
2195 G_CALLBACK(poi_list_export_gpx), pli);
2197 gtk_widget_show_all(pli->dialog2);
2199 gtk_dialog_run(GTK_DIALOG(pli->dialog2));
2201 gtk_widget_destroy(pli->dialog2);
2202 pli->dialog2 = NULL;
2204 vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
2209 poi_list_dialog(GtkWidget *parent, gint unitx, gint unity, GList *poi_list)
2211 static PoiListInfo pli = { NULL, NULL };
2212 static GtkWidget *scroller;
2213 static GtkWidget *btn_goto;
2214 static GtkWidget *btn_edit;
2215 static GtkWidget *btn_manage_checks;
2216 static GtkListStore *store;
2219 gdouble src_lat, src_lon;
2220 printf("%s()\n", __PRETTY_FUNCTION__);
2222 if(pli.dialog == NULL)
2224 GtkCellRenderer *renderer;
2225 GtkTreeViewColumn *column;
2227 pli.dialog = gtk_dialog_new_with_buttons(_("POI List"),
2228 GTK_WINDOW(parent), GTK_DIALOG_MODAL,
2231 store = gtk_list_store_new(POI_NUM_COLUMNS,
2232 G_TYPE_BOOLEAN,/* Selected */
2233 G_TYPE_INT, /* POI ID */
2234 G_TYPE_INT, /* Category ID */
2235 G_TYPE_DOUBLE, /* Latitude */
2236 G_TYPE_DOUBLE, /* Longitude */
2237 G_TYPE_STRING, /* Lat/Lon */
2238 G_TYPE_FLOAT, /* Bearing */
2239 G_TYPE_FLOAT, /* Distance */
2240 G_TYPE_STRING, /* POI Label */
2241 G_TYPE_STRING, /* POI Desc. */
2242 G_TYPE_STRING);/* Category Label */
2244 /* Set up the tree view. */
2245 pli.tree_view = gtk_tree_view_new();
2246 g_object_set(G_OBJECT(pli.tree_view),
2247 "allow-checkbox-mode", FALSE, NULL);
2249 gtk_tree_selection_set_mode(
2250 gtk_tree_view_get_selection(GTK_TREE_VIEW(pli.tree_view)),
2251 GTK_SELECTION_SINGLE);
2252 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(pli.tree_view), TRUE);
2254 renderer = gtk_cell_renderer_toggle_new();
2255 gtk_cell_renderer_toggle_set_active(GTK_CELL_RENDERER_TOGGLE(renderer),
2257 g_signal_connect(G_OBJECT(renderer), "toggled",
2258 G_CALLBACK(poi_list_row_selected), store);
2259 pli.select_column = gtk_tree_view_column_new_with_attributes(
2260 "*", renderer, "active", POI_SELECTED, NULL);
2261 gtk_tree_view_append_column(GTK_TREE_VIEW(pli.tree_view),
2263 gtk_tree_view_column_set_clickable(pli.select_column, TRUE);
2264 g_signal_connect(G_OBJECT(pli.select_column), "clicked",
2265 G_CALLBACK(poi_list_select_all), &pli);
2267 renderer = gtk_cell_renderer_combo_new();
2268 column = gtk_tree_view_column_new_with_attributes(
2269 _("Category"), renderer, "text", POI_CLABEL, NULL);
2270 gtk_tree_view_column_set_sizing(column,GTK_TREE_VIEW_COLUMN_GROW_ONLY);
2271 gtk_tree_view_column_set_sort_column_id(column, POI_CLABEL);
2272 gtk_tree_view_append_column(GTK_TREE_VIEW(pli.tree_view), column);
2274 renderer = gtk_cell_renderer_text_new();
2275 g_object_set(renderer, "xalign", 1.f, NULL);
2276 column = gtk_tree_view_column_new_with_attributes(
2277 _("Dist."), renderer, "text", POI_DISTANCE, NULL);
2278 gtk_tree_view_column_set_cell_data_func(column, renderer,
2279 (GtkTreeCellDataFunc)poi_list_distance_cell_data_func,
2281 gtk_tree_view_column_set_sort_column_id(column, POI_DISTANCE);
2282 gtk_tree_view_append_column(GTK_TREE_VIEW(pli.tree_view), column);
2284 renderer = gtk_cell_renderer_text_new();
2285 g_object_set(renderer, "xalign", 1.f, NULL);
2286 column = gtk_tree_view_column_new_with_attributes(
2287 _("Bear."), renderer, "text", POI_BEARING, NULL);
2288 gtk_tree_view_column_set_cell_data_func(column, renderer,
2289 (GtkTreeCellDataFunc)poi_list_bearing_cell_data_func,
2291 gtk_tree_view_column_set_sort_column_id(column, POI_BEARING);
2292 gtk_tree_view_append_column(GTK_TREE_VIEW(pli.tree_view), column);
2294 renderer = gtk_cell_renderer_text_new();
2295 column = gtk_tree_view_column_new_with_attributes(
2296 _("Label"), renderer, "text", POI_LABEL, NULL);
2297 gtk_tree_view_column_set_sort_column_id(column, POI_LABEL);
2298 gtk_tree_view_append_column(GTK_TREE_VIEW(pli.tree_view), column);
2300 g_signal_connect(G_OBJECT(pli.tree_view), "row-activated",
2301 G_CALLBACK(poi_list_row_activated), &pli);
2303 gtk_tree_view_set_model(GTK_TREE_VIEW(pli.tree_view),
2304 GTK_TREE_MODEL(store));
2305 g_object_unref(G_OBJECT(store));
2307 /* Enable the help button. */
2309 hildon_help_dialog_help_enable(
2311 ossohelp_dialog_help_enable(
2313 GTK_DIALOG(pli.dialog), HELP_ID_POILIST, _osso);
2315 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(pli.dialog)->action_area),
2316 btn_goto = gtk_button_new_with_label(_("Go to")));
2318 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(pli.dialog)->action_area),
2319 btn_edit = gtk_button_new_with_label(_("Edit...")));
2321 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(pli.dialog)->action_area),
2322 btn_manage_checks = gtk_button_new_with_label(
2323 _("Checked POI Actions...")));
2325 gtk_dialog_add_button(GTK_DIALOG(pli.dialog),
2326 GTK_STOCK_CLOSE, GTK_RESPONSE_ACCEPT);
2328 gtk_window_set_default_size(GTK_WINDOW(pli.dialog), 500, 400);
2330 scroller = gtk_scrolled_window_new (NULL, NULL);
2331 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scroller),
2332 GTK_SHADOW_ETCHED_IN);
2333 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroller),
2335 GTK_POLICY_AUTOMATIC);
2336 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(pli.dialog)->vbox),
2337 scroller, TRUE, TRUE, 0);
2339 gtk_container_add(GTK_CONTAINER(scroller), pli.tree_view);
2341 g_signal_connect(G_OBJECT(btn_goto), "clicked",
2342 G_CALLBACK(poi_list_goto), &pli);
2344 g_signal_connect(G_OBJECT(btn_edit), "clicked",
2345 G_CALLBACK(poi_list_view), &pli);
2347 g_signal_connect(G_OBJECT(btn_manage_checks), "clicked",
2348 G_CALLBACK(poi_list_manage_checks), &pli);
2351 /* Initialize the tree store. */
2353 gtk_list_store_clear(store);
2354 pli.select_all = FALSE;
2356 unit2latlon(unitx, unity, src_lat, src_lon);
2358 for(curr = poi_list; curr; curr = curr->next)
2360 PoiInfo *poi_info = curr->data;
2361 gchar tmp1[LL_FMT_LEN], tmp2[LL_FMT_LEN];
2363 printf("poi: (%f, %f, %s, %s)\n",
2364 poi_info->lat, poi_info->lon,
2365 poi_info->label, poi_info->desc);
2367 format_lat_lon(poi_info->lat, poi_info->lon, tmp1, tmp2);
2368 //lat_format(poi_info->lat, tmp1);
2369 //lon_format(poi_info->lon, tmp2);
2371 gtk_list_store_append(store, &iter);
2372 gtk_list_store_set(store, &iter,
2374 POI_POIID, poi_info->poi_id,
2375 POI_LAT, poi_info->lat,
2376 POI_LON, poi_info->lon,
2377 POI_BEARING, calculate_bearing(src_lat, src_lon,
2378 poi_info->lat, poi_info->lon),
2379 POI_DISTANCE, calculate_distance(src_lat,src_lon,
2380 poi_info->lat, poi_info->lon) * UNITS_CONVERT[_units],
2381 POI_LABEL, poi_info->label,
2382 POI_DESC, poi_info->desc,
2383 POI_CATID, poi_info->cat_id,
2384 POI_CLABEL, poi_info->clabel,
2388 gtk_widget_show_all(pli.dialog);
2390 GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(pli.dialog));
2394 gtk_widget_hide(pli.dialog);
2396 vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
2401 poi_import_dialog(gint unitx, gint unity)
2403 GtkWidget *dialog = NULL;
2404 gboolean success = FALSE;
2405 printf("%s()\n", __PRETTY_FUNCTION__);
2407 dialog = hildon_file_chooser_dialog_new(GTK_WINDOW(_window),
2408 GTK_FILE_CHOOSER_ACTION_OPEN);
2410 gtk_widget_show_all(dialog);
2412 while(!success && gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK)
2414 gchar *file_uri_str = NULL;
2415 gchar *bytes = NULL;
2417 GnomeVFSResult vfs_result;
2418 GList *poi_list = NULL;
2420 file_uri_str = gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(dialog));
2422 /* Parse the given file as GPX. */
2423 if(GNOME_VFS_OK != (vfs_result = gnome_vfs_read_entire_file(
2424 file_uri_str, &size, &bytes)))
2426 popup_error(dialog, gnome_vfs_result_to_string(vfs_result));
2428 else if(gpx_poi_parse(bytes, size, &poi_list))
2430 static GtkWidget *cat_dialog = NULL;
2431 static GtkWidget *cmb_category = NULL;
2432 static GtkWidget *btn_catedit = NULL;
2433 static PoiCategoryEditInfo pcedit;
2439 cat_dialog = gtk_dialog_new_with_buttons(_("Default Category"),
2440 GTK_WINDOW(dialog), GTK_DIALOG_MODAL,
2441 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
2442 GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
2445 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(cat_dialog)->vbox),
2446 hbox = gtk_hbox_new(FALSE, 4), FALSE, FALSE, 4);
2448 gtk_box_pack_start(GTK_BOX(hbox),
2449 label = gtk_label_new(_("Category")),
2452 gtk_box_pack_start(GTK_BOX(hbox),
2453 cmb_category = poi_create_cat_combo(),
2456 gtk_box_pack_start(GTK_BOX(hbox),
2457 btn_catedit = gtk_button_new_with_label(
2458 _("Edit Categories...")),
2461 /* Connect Signals */
2462 pcedit.dialog = dialog;
2463 pcedit.cmb_category = cmb_category;
2465 g_signal_connect(G_OBJECT(btn_catedit), "clicked",
2466 G_CALLBACK(poi_edit_cat), &pcedit);
2469 gtk_widget_show_all(cat_dialog);
2471 while(GTK_RESPONSE_ACCEPT ==gtk_dialog_run(GTK_DIALOG(cat_dialog)))
2473 if(gtk_combo_box_get_active(GTK_COMBO_BOX(cmb_category)) == -1)
2476 _("Please specify a default category."));
2480 /* Insert the POIs into the database. */
2481 gint num_inserts = poi_list_insert(dialog,
2482 poi_list, GTK_COMBO_BOX(cmb_category));
2486 /* Hide the dialogs. */
2487 gtk_widget_hide(cat_dialog);
2489 /* Create a new dialog with the results. */
2490 poi_list_dialog(dialog, unitx, unity, poi_list);
2496 gtk_widget_hide(cat_dialog);
2498 poi_list_free(poi_list);
2501 popup_error(dialog, _("Error parsing GPX file."));
2503 g_free(file_uri_str);
2507 /* Hide the dialog. */
2508 gtk_widget_destroy(dialog);
2510 vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
2515 poi_download_cat_selected(GtkComboBox *cmb_category, GtkEntry *txt_query)
2518 printf("%s()\n", __PRETTY_FUNCTION__);
2520 if(gtk_combo_box_get_active_iter(GTK_COMBO_BOX(cmb_category), &iter))
2522 gchar buffer[BUFFER_SIZE];
2523 GtkWidget *confirm = NULL;
2524 gchar *category = NULL;
2527 gtk_combo_box_get_model(GTK_COMBO_BOX(cmb_category)), &iter,
2531 if(*gtk_entry_get_text(txt_query))
2533 snprintf(buffer, sizeof(buffer), "%s\n %s",
2534 _("Overwrite query with the following text?"), category);
2535 confirm = hildon_note_new_confirmation(GTK_WINDOW(_window),buffer);
2540 || GTK_RESPONSE_OK == gtk_dialog_run(GTK_DIALOG(confirm)))
2541 gtk_entry_set_text(txt_query, category);
2544 gtk_widget_destroy(confirm);
2547 vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
2553 origin_type_selected(GtkWidget *toggle, OriginToggleInfo *oti)
2555 printf("%s()\n", __PRETTY_FUNCTION__);
2557 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toggle)))
2558 gtk_widget_set_sensitive(oti->txt_origin, toggle == oti->rad_use_text);
2560 vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
2565 poi_download_dialog(gint unitx, gint unity)
2567 static GtkWidget *dialog = NULL;
2568 static GtkWidget *hbox = NULL;
2569 static GtkWidget *table = NULL;
2570 static GtkWidget *table2 = NULL;
2571 static GtkWidget *label = NULL;
2572 static GtkWidget *num_page = NULL;
2573 static GtkWidget *txt_source_url = NULL;
2574 static OriginToggleInfo oti;
2575 static GtkWidget *cmb_category;
2576 printf("%s()\n", __PRETTY_FUNCTION__);
2578 conic_recommend_connected();
2582 GtkEntryCompletion *origin_comp;
2584 dialog = gtk_dialog_new_with_buttons(_("Download POIs"),
2585 GTK_WINDOW(_window), GTK_DIALOG_MODAL,
2586 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
2587 GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
2590 /* Enable the help button. */
2592 hildon_help_dialog_help_enable(
2594 ossohelp_dialog_help_enable(
2596 GTK_DIALOG(dialog), HELP_ID_DOWNPOI, _osso);
2598 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
2599 table = gtk_table_new(4, 4, FALSE), TRUE, TRUE, 0);
2602 gtk_table_attach(GTK_TABLE(table),
2603 hbox = gtk_hbox_new(FALSE, 4),
2604 0, 4, 0, 1, GTK_EXPAND | GTK_FILL, 0, 2, 4);
2605 gtk_box_pack_start(GTK_BOX(hbox),
2606 label = gtk_label_new(_("Source URL")), FALSE, TRUE, 4);
2607 gtk_box_pack_start(GTK_BOX(hbox),
2608 txt_source_url = gtk_entry_new(), TRUE, TRUE, 4);
2611 gtk_table_attach(GTK_TABLE(table),
2612 oti.rad_use_gps = gtk_radio_button_new_with_label(NULL,
2613 _("Use GPS Location")),
2614 0, 1, 1, 2, GTK_FILL, 0, 2, 4);
2616 /* Use End of Route. */
2617 gtk_table_attach(GTK_TABLE(table),
2618 oti.rad_use_route = gtk_radio_button_new_with_label_from_widget(
2619 GTK_RADIO_BUTTON(oti.rad_use_gps), _("Use End of Route")),
2620 0, 1, 2, 3, GTK_FILL, 0, 2, 4);
2623 gtk_table_attach(GTK_TABLE(table),
2624 gtk_vseparator_new(),
2625 1, 2, 1, 3, GTK_FILL, GTK_FILL, 2,4);
2628 gtk_table_attach(GTK_TABLE(table),
2629 label = gtk_label_new(_("Category")),
2630 2, 3, 1, 2, GTK_FILL, 0, 2, 4);
2631 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
2632 gtk_table_attach(GTK_TABLE(table),
2633 cmb_category = poi_create_cat_combo(),
2634 3, 4, 1, 2, GTK_FILL, 0, 2, 4);
2637 gtk_table_attach(GTK_TABLE(table),
2638 label = gtk_label_new(_("Page")),
2639 2, 3, 2, 3, GTK_FILL, 0, 2, 4);
2640 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
2641 gtk_table_attach(GTK_TABLE(table),
2642 num_page = hildon_number_editor_new(1, 999),
2643 3, 4, 2, 3, GTK_FILL, 0, 2, 4);
2646 /* Another table for the Origin and Query. */
2647 gtk_table_attach(GTK_TABLE(table),
2648 table2 = gtk_table_new(2, 2, FALSE),
2649 0, 4, 3, 4, GTK_EXPAND | GTK_FILL, 0, 2, 4);
2652 gtk_table_attach(GTK_TABLE(table2),
2653 oti.rad_use_text = gtk_radio_button_new_with_label_from_widget(
2654 GTK_RADIO_BUTTON(oti.rad_use_gps), _("Origin")),
2655 0, 1, 0, 1, GTK_FILL, 0, 2, 4);
2656 gtk_table_attach(GTK_TABLE(table2),
2657 oti.txt_origin = gtk_entry_new(),
2658 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, 0, 2, 4);
2659 gtk_entry_set_width_chars(GTK_ENTRY(oti.txt_origin), 25);
2660 #ifdef MAEMO_CHANGES
2662 g_object_set(G_OBJECT(oti.txt_origin), "hildon-input-mode",
2663 HILDON_GTK_INPUT_MODE_FULL, NULL);
2665 g_object_set(G_OBJECT(oti.txt_origin), HILDON_AUTOCAP, FALSE, NULL);
2670 gtk_table_attach(GTK_TABLE(table2),
2671 label = gtk_label_new(_("Query")),
2672 0, 1, 1, 2, GTK_FILL, 0, 2, 4);
2673 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
2674 gtk_table_attach(GTK_TABLE(table2),
2675 oti.txt_query = gtk_entry_new(),
2676 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 4);
2677 gtk_entry_set_width_chars(GTK_ENTRY(oti.txt_query), 25);
2678 #ifdef MAEMO_CHANGES
2680 g_object_set(G_OBJECT(oti.txt_query), "hildon-input-mode",
2681 HILDON_GTK_INPUT_MODE_FULL, NULL);
2683 g_object_set(G_OBJECT(oti.txt_query), HILDON_AUTOCAP, FALSE, NULL);
2687 /* Set up auto-completion. */
2688 origin_comp = gtk_entry_completion_new();
2689 gtk_entry_completion_set_model(origin_comp,GTK_TREE_MODEL(_loc_model));
2690 gtk_entry_completion_set_text_column(origin_comp, 0);
2691 gtk_entry_set_completion(GTK_ENTRY(oti.txt_origin), origin_comp);
2693 g_signal_connect(G_OBJECT(oti.rad_use_gps), "toggled",
2694 G_CALLBACK(origin_type_selected), &oti);
2695 g_signal_connect(G_OBJECT(oti.rad_use_route), "toggled",
2696 G_CALLBACK(origin_type_selected), &oti);
2697 g_signal_connect(G_OBJECT(oti.rad_use_text), "toggled",
2698 G_CALLBACK(origin_type_selected), &oti);
2700 g_signal_connect(G_OBJECT(cmb_category), "changed",
2701 G_CALLBACK(poi_download_cat_selected), oti.txt_query);
2704 /* Initialize fields. */
2706 hildon_number_editor_set_value(HILDON_NUMBER_EDITOR(num_page), 1);
2708 gtk_entry_set_text(GTK_ENTRY(txt_source_url), _poi_dl_url);
2716 unit2latlon(unitx, unity, lat, lon);
2718 g_ascii_formatd(strlat, 32, "%.06f", lat);
2719 g_ascii_formatd(strlon, 32, "%.06f", lon);
2720 snprintf(buffer, sizeof(buffer), "%s, %s", strlat, strlon);
2722 gtk_entry_set_text(GTK_ENTRY(oti.txt_origin), buffer);
2723 gtk_toggle_button_set_active(
2724 GTK_TOGGLE_BUTTON(oti.rad_use_text), TRUE);
2726 /* Else use "End of Route" by default if they have a route. */
2727 else if(_route.head != _route.tail)
2729 /* There is no route, so make it the default. */
2730 gtk_widget_set_sensitive(oti.rad_use_route, TRUE);
2731 gtk_toggle_button_set_active(
2732 GTK_TOGGLE_BUTTON(oti.rad_use_route), TRUE);
2733 gtk_widget_grab_focus(oti.rad_use_route);
2735 /* Else use "GPS Location" if they have GPS enabled. */
2738 /* There is no route, so desensitize "Use End of Route." */
2739 gtk_widget_set_sensitive(oti.rad_use_route, FALSE);
2742 gtk_toggle_button_set_active(
2743 GTK_TOGGLE_BUTTON(oti.rad_use_gps), TRUE);
2744 gtk_widget_grab_focus(oti.rad_use_gps);
2746 /* Else use text. */
2749 gtk_toggle_button_set_active(
2750 GTK_TOGGLE_BUTTON(oti.rad_use_text), TRUE);
2751 gtk_widget_grab_focus(oti.txt_origin);
2755 gtk_widget_show_all(dialog);
2757 while(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
2759 gchar origin_buffer[BUFFER_SIZE];
2760 const gchar *source_url, *origin, *query;
2761 gchar *file_uri_str = NULL;
2762 gchar *bytes = NULL;
2764 GnomeVFSResult vfs_result;
2765 GList *poi_list = NULL;
2767 source_url = gtk_entry_get_text(GTK_ENTRY(txt_source_url));
2768 if(!strlen(source_url))
2770 popup_error(dialog, _("Please specify a source URL."));
2775 g_free(_poi_dl_url);
2776 _poi_dl_url = g_strdup(source_url);
2779 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(oti.rad_use_gps)))
2783 latlon2unit(_gps.lat, _gps.lon, unitx, unity);
2784 g_ascii_formatd(strlat, 32, "%.06f", _gps.lat);
2785 g_ascii_formatd(strlon, 32, "%.06f", _gps.lon);
2786 snprintf(origin_buffer, sizeof(origin_buffer),
2787 "%s, %s", strlat, strlon);
2788 origin = origin_buffer;
2790 else if(gtk_toggle_button_get_active(
2791 GTK_TOGGLE_BUTTON(oti.rad_use_route)))
2798 /* Use last non-zero route point. */
2799 for(p = _route.tail; !p->unity; p--) { }
2803 unit2latlon(p->unitx, p->unity, lat, lon);
2804 g_ascii_formatd(strlat, 32, "%.06f", lat);
2805 g_ascii_formatd(strlon, 32, "%.06f", lon);
2806 snprintf(origin_buffer, sizeof(origin_buffer),
2807 "%s, %s", strlat, strlon);
2808 origin = origin_buffer;
2813 origin = gtk_entry_get_text(GTK_ENTRY(oti.txt_origin));
2816 porig = locate_address(dialog, origin);
2824 popup_error(dialog, _("Please specify an origin."));
2828 if(gtk_combo_box_get_active(GTK_COMBO_BOX(cmb_category)) == -1)
2830 popup_error(dialog, _("Please specify a default category."));
2834 query = gtk_entry_get_text(GTK_ENTRY(oti.txt_query));
2837 popup_error(dialog, _("Please specify a query."));
2841 /* Construct the URL. */
2843 gchar *origin_escaped;
2844 gchar *query_escaped;
2846 origin_escaped = gnome_vfs_escape_string(origin);
2847 query_escaped = gnome_vfs_escape_string(query);
2848 file_uri_str = g_strdup_printf(
2849 source_url, origin_escaped, query_escaped,
2850 hildon_number_editor_get_value(
2851 HILDON_NUMBER_EDITOR(num_page)));
2852 g_free(origin_escaped);
2853 g_free(query_escaped);
2856 /* Parse the given file as GPX. */
2857 if(GNOME_VFS_OK != (vfs_result = gnome_vfs_read_entire_file(
2858 file_uri_str, &size, &bytes)))
2860 popup_error(dialog, gnome_vfs_result_to_string(vfs_result));
2862 else if(strncmp(bytes, "<?xml", strlen("<?xml")))
2864 /* Not an XML document - must be bad locations. */
2865 popup_error(dialog, _("Invalid origin or query."));
2866 printf("bytes: %s\n", bytes);
2868 else if(gpx_poi_parse(bytes, size, &poi_list))
2870 /* Insert the POIs into the database. */
2871 gint num_inserts = poi_list_insert(dialog, poi_list,
2872 GTK_COMBO_BOX(cmb_category));
2876 /* Create a new dialog with the results. */
2877 poi_list_dialog(dialog, unitx, unity, poi_list);
2880 poi_list_free(poi_list);
2883 popup_error(dialog, _("Error parsing GPX file."));
2885 g_free(file_uri_str);
2888 /* Increment the page number for them. */
2889 hildon_number_editor_set_value(HILDON_NUMBER_EDITOR(num_page),
2890 hildon_number_editor_get_value(HILDON_NUMBER_EDITOR(num_page)) +1);
2893 /* Hide the dialog. */
2894 gtk_widget_hide(dialog);
2896 vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
2901 poi_browse_dialog(gint unitx, gint unity)
2903 static GtkWidget *dialog = NULL;
2904 static GtkWidget *table = NULL;
2905 static GtkWidget *table2 = NULL;
2906 static GtkWidget *label = NULL;
2907 static GtkWidget *cmb_category = NULL;
2908 static OriginToggleInfo oti;
2909 printf("%s()\n", __PRETTY_FUNCTION__);
2913 GtkEntryCompletion *origin_comp;
2915 dialog = gtk_dialog_new_with_buttons(_("Browse POIs"),
2916 GTK_WINDOW(_window), GTK_DIALOG_MODAL,
2917 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
2918 GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
2921 /* Enable the help button. */
2923 hildon_help_dialog_help_enable(
2925 ossohelp_dialog_help_enable(
2927 GTK_DIALOG(dialog), HELP_ID_BROWSEPOI, _osso);
2929 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
2930 table = gtk_table_new(3, 4, FALSE), TRUE, TRUE, 0);
2933 gtk_table_attach(GTK_TABLE(table),
2934 oti.rad_use_gps = gtk_radio_button_new_with_label(NULL,
2935 _("Use GPS Location")),
2936 0, 1, 0, 1, GTK_FILL, 0, 2, 4);
2938 /* Use End of Route. */
2939 gtk_table_attach(GTK_TABLE(table),
2940 oti.rad_use_route = gtk_radio_button_new_with_label_from_widget(
2941 GTK_RADIO_BUTTON(oti.rad_use_gps), _("Use End of Route")),
2942 0, 1, 1, 2, GTK_FILL, 0, 2, 4);
2944 gtk_table_attach(GTK_TABLE(table),
2945 gtk_vseparator_new(),
2946 1, 2, 0, 2, GTK_FILL, GTK_FILL, 2, 4);
2949 gtk_table_attach(GTK_TABLE(table),
2950 label = gtk_label_new(_("Category")),
2951 2, 3, 0, 1, GTK_FILL, 0, 2, 4);
2952 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
2953 gtk_table_attach(GTK_TABLE(table),
2954 cmb_category = poi_create_cat_combo(),
2955 3, 4, 0, 1, GTK_FILL, 0, 2, 4);
2956 /* Add an extra, "<any>" category. */
2959 GtkListStore *store = GTK_LIST_STORE(gtk_combo_box_get_model(
2960 GTK_COMBO_BOX(cmb_category)));
2961 gtk_list_store_prepend(store, &iter);
2962 gtk_list_store_set(store, &iter, 0, -1, 1, "<any>", -1);
2963 gtk_combo_box_set_active_iter(GTK_COMBO_BOX(cmb_category), &iter);
2967 /* Another table for the Origin and Query. */
2968 gtk_table_attach(GTK_TABLE(table),
2969 table2 = gtk_table_new(2, 2, FALSE),
2970 0, 4, 2, 3, GTK_EXPAND | GTK_FILL, 0, 2, 4);
2973 gtk_table_attach(GTK_TABLE(table2),
2974 oti.rad_use_text = gtk_radio_button_new_with_label_from_widget(
2975 GTK_RADIO_BUTTON(oti.rad_use_gps), _("Origin")),
2976 0, 1, 0, 1, GTK_FILL, 0, 2, 4);
2977 gtk_table_attach(GTK_TABLE(table2),
2978 oti.txt_origin = gtk_entry_new(),
2979 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, 0, 2, 4);
2980 gtk_entry_set_width_chars(GTK_ENTRY(oti.txt_origin), 25);
2981 #ifdef MAEMO_CHANGES
2983 g_object_set(G_OBJECT(oti.txt_origin), "hildon-input-mode",
2984 HILDON_GTK_INPUT_MODE_FULL, NULL);
2986 g_object_set(G_OBJECT(oti.txt_origin), HILDON_AUTOCAP, FALSE, NULL);
2991 gtk_table_attach(GTK_TABLE(table2),
2992 label = gtk_label_new(_("Query")),
2993 0, 1, 1, 2, GTK_FILL, 0, 2, 4);
2994 gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
2995 gtk_table_attach(GTK_TABLE(table2),
2996 oti.txt_query = gtk_entry_new(),
2997 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 4);
2998 gtk_entry_set_width_chars(GTK_ENTRY(oti.txt_query), 25);
2999 #ifdef MAEMO_CHANGES
3001 g_object_set(G_OBJECT(oti.txt_query), "hildon-input-mode",
3002 HILDON_GTK_INPUT_MODE_FULL, NULL);
3004 g_object_set(G_OBJECT(oti.txt_query), HILDON_AUTOCAP, FALSE, NULL);
3008 /* Set up auto-completion. */
3009 origin_comp = gtk_entry_completion_new();
3010 gtk_entry_completion_set_model(origin_comp,GTK_TREE_MODEL(_loc_model));
3011 gtk_entry_completion_set_text_column(origin_comp, 0);
3012 gtk_entry_set_completion(GTK_ENTRY(oti.txt_origin), origin_comp);
3014 g_signal_connect(G_OBJECT(oti.rad_use_gps), "toggled",
3015 G_CALLBACK(origin_type_selected), &oti);
3016 g_signal_connect(G_OBJECT(oti.rad_use_route), "toggled",
3017 G_CALLBACK(origin_type_selected), &oti);
3018 g_signal_connect(G_OBJECT(oti.rad_use_text), "toggled",
3019 G_CALLBACK(origin_type_selected), &oti);
3022 /* Initialize fields. */
3031 unit2latlon(unitx, unity, lat, lon);
3033 g_ascii_formatd(strlat, 32, "%.06f", lat);
3034 g_ascii_formatd(strlon, 32, "%.06f", lon);
3035 snprintf(buffer, sizeof(buffer), "%s, %s", strlat, strlon);
3037 gtk_entry_set_text(GTK_ENTRY(oti.txt_origin), buffer);
3038 gtk_toggle_button_set_active(
3039 GTK_TOGGLE_BUTTON(oti.rad_use_text), TRUE);
3041 /* Else use "End of Route" by default if they have a route. */
3042 else if(_route.head != _route.tail)
3044 /* There is no route, so make it the default. */
3045 gtk_widget_set_sensitive(oti.rad_use_route, TRUE);
3046 gtk_toggle_button_set_active(
3047 GTK_TOGGLE_BUTTON(oti.rad_use_route), TRUE);
3048 gtk_widget_grab_focus(oti.rad_use_route);
3050 /* Else use "GPS Location" if they have GPS enabled. */
3053 /* There is no route, so desensitize "Use End of Route." */
3054 gtk_widget_set_sensitive(oti.rad_use_route, FALSE);
3057 gtk_toggle_button_set_active(
3058 GTK_TOGGLE_BUTTON(oti.rad_use_gps), TRUE);
3059 gtk_widget_grab_focus(oti.rad_use_gps);
3061 /* Else use text. */
3064 gtk_toggle_button_set_active(
3065 GTK_TOGGLE_BUTTON(oti.rad_use_text), TRUE);
3066 gtk_widget_grab_focus(oti.txt_origin);
3070 gtk_widget_show_all(dialog);
3072 while(gtk_dialog_run(GTK_DIALOG(dialog)) ==GTK_RESPONSE_ACCEPT)
3074 gchar buffer[BUFFER_SIZE];
3075 const gchar *origin, *query;
3077 GList *poi_list = NULL;
3079 gboolean is_cat = FALSE;
3082 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(oti.rad_use_gps)))
3086 latlon2unit(_gps.lat, _gps.lon, unitx, unity);
3087 g_ascii_formatd(strlat, 32, "%.06f", _gps.lat);
3088 g_ascii_formatd(strlon, 32, "%.06f", _gps.lon);
3089 snprintf(buffer, sizeof(buffer), "%s, %s", strlat, strlon);
3092 else if(gtk_toggle_button_get_active(
3093 GTK_TOGGLE_BUTTON(oti.rad_use_route)))
3100 /* Use last non-zero route point. */
3101 for(p = _route.tail; !p->unity; p--) { }
3105 unit2latlon(p->unitx, p->unity, lat, lon);
3106 g_ascii_formatd(strlat, 32, "%.06f", lat);
3107 g_ascii_formatd(strlon, 32, "%.06f", lon);
3108 snprintf(buffer, sizeof(buffer), "%s, %s", strlat, strlon);
3114 origin = gtk_entry_get_text(GTK_ENTRY(oti.txt_origin));
3115 porig = locate_address(dialog, origin);
3122 popup_error(dialog, _("Please specify an origin."));
3126 /* Check if we're doing a category search. */
3129 if(gtk_combo_box_get_active_iter(
3130 GTK_COMBO_BOX(cmb_category), &iter))
3133 gtk_combo_box_get_model(GTK_COMBO_BOX(cmb_category)),
3134 &iter, 0, &cat_id, -1);
3142 query = g_strdup_printf("%%%s%%",
3143 gtk_entry_get_text(GTK_ENTRY(oti.txt_query)));
3145 unit2latlon(unitx, unity, lat, lon);
3149 if(SQLITE_OK != sqlite3_bind_int(_stmt_browsecat_poi, 1, cat_id) ||
3150 SQLITE_OK != sqlite3_bind_text(_stmt_browsecat_poi, 2, query,
3152 SQLITE_OK != sqlite3_bind_double(_stmt_browsecat_poi, 3, lat) ||
3153 SQLITE_OK != sqlite3_bind_double(_stmt_browsecat_poi, 4, lon))
3155 g_printerr("Failed to bind values for _stmt_browsecat_poi\n");
3158 stmt = _stmt_browsecat_poi;
3162 if(SQLITE_OK != sqlite3_bind_text(_stmt_browse_poi, 1, query,
3164 SQLITE_OK != sqlite3_bind_double(_stmt_browse_poi, 2, lat) ||
3165 SQLITE_OK != sqlite3_bind_double(_stmt_browse_poi, 3, lon))
3167 g_printerr("Failed to bind values for _stmt_browse_poi\n");
3170 stmt = _stmt_browse_poi;
3173 while(SQLITE_ROW == sqlite3_step(stmt))
3175 PoiInfo *poi = g_slice_new(PoiInfo);
3176 poi->poi_id = sqlite3_column_int(stmt, 0);
3177 poi->cat_id = sqlite3_column_int(stmt, 1);
3178 poi->lat = sqlite3_column_double(stmt, 2);
3179 poi->lon = sqlite3_column_double(stmt, 3);
3180 poi->label =g_strdup(sqlite3_column_text(stmt, 4));
3181 poi->desc = g_strdup(sqlite3_column_text(stmt, 5));
3182 poi->clabel=g_strdup(sqlite3_column_text(stmt, 6));
3183 poi_list = g_list_prepend(poi_list, poi);
3185 sqlite3_reset(stmt);
3189 /* Create a new dialog with the results. */
3190 poi_list_dialog(dialog, unitx, unity, poi_list);
3191 poi_list_free(poi_list);
3194 popup_error(dialog, _("No POIs found."));
3199 /* Hide the dialog. */
3200 gtk_widget_hide(dialog);
3202 vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
3207 * Render all the POI data. This should be done before rendering track data.
3213 gdouble lat1, lat2, lon1, lon2;
3216 GdkPixbuf *pixbuf = NULL;
3217 GError *error = NULL;
3218 printf("%s()\n", __PRETTY_FUNCTION__);
3220 if(_poi_db && _poi_zoom > _zoom)
3222 gint diag_offset = pixel2unit(MAX(_view_width_pixels,
3223 _view_height_pixels) / 2);
3224 buf2unit(0, _view_height_pixels, unitx, unity);
3225 unitx = _center.unitx - diag_offset;
3226 unity = _center.unity + diag_offset;
3227 unit2latlon(unitx, unity, lat1, lon1);
3228 unitx = _center.unitx + diag_offset;
3229 unity = _center.unity - diag_offset;
3230 unit2latlon(unitx, unity, lat2, lon2);
3232 if(SQLITE_OK != sqlite3_bind_double(_stmt_select_poi, 1, lat1) ||
3233 SQLITE_OK != sqlite3_bind_double(_stmt_select_poi, 2, lat2) ||
3234 SQLITE_OK != sqlite3_bind_double(_stmt_select_poi, 3, lon1) ||
3235 SQLITE_OK != sqlite3_bind_double(_stmt_select_poi, 4, lon2))
3237 g_printerr("Failed to bind values for _stmt_select_poi\n");
3241 while(SQLITE_ROW == sqlite3_step(_stmt_select_poi))
3243 lat1 = sqlite3_column_double(_stmt_select_poi, 0);
3244 lon1 = sqlite3_column_double(_stmt_select_poi, 1);
3245 gchar *poi_label = g_utf8_strdown(sqlite3_column_text(
3246 _stmt_select_poi, 3), -1);
3247 gchar *cat_label = g_utf8_strdown(sqlite3_column_text(
3248 _stmt_select_poi, 6), -1);
3250 latlon2unit(lat1, lon1, unitx, unity);
3251 unit2buf(unitx, unity, poix, poiy);
3253 /* Try to get icon for specific POI first. */
3254 snprintf(buffer, sizeof(buffer), "%s/%s.jpg",
3255 _poi_db_dirname, poi_label);
3256 pixbuf = gdk_pixbuf_new_from_file(buffer, &error);
3259 /* No icon for specific POI - try for category. */
3261 snprintf(buffer, sizeof(buffer), "%s/%s.jpg",
3262 _poi_db_dirname, cat_label);
3263 pixbuf = gdk_pixbuf_new_from_file(buffer, &error);
3267 /* No icon for POI or for category.
3268 * Try default POI icon file. */
3270 snprintf(buffer, sizeof(buffer), "%s/poi.jpg",
3272 pixbuf = gdk_pixbuf_new_from_file(buffer, &error);
3276 /* No icon for POI or for category or default POI icon file.
3277 Draw default purple square. */
3279 gdk_draw_rectangle(_map_pixmap, _gc[COLORABLE_POI], TRUE,
3280 poix - (gint)(1.5f * _draw_width),
3281 poiy - (gint)(1.5f * _draw_width),
3287 /* We found an icon to draw. */
3293 poix - gdk_pixbuf_get_width(pixbuf) / 2,
3294 poiy - gdk_pixbuf_get_height(pixbuf) / 2,
3296 GDK_RGB_DITHER_NONE, 0, 0);
3297 g_object_unref(pixbuf);
3303 sqlite3_reset(_stmt_select_poi);
3306 vprintf("%s(): return\n", __PRETTY_FUNCTION__);
3312 printf("%s()\n", __PRETTY_FUNCTION__);
3316 sqlite3_close(_poi_db);
3320 vprintf("%s(): return\n", __PRETTY_FUNCTION__);
3324 extern AprsDataRow *n_first; // pointer to first element in name sorted station list
3327 /////////////////////
3330 * Render all the APRS data.
3335 printf("%s()\n", __PRETTY_FUNCTION__);
3337 if(_poi_zoom > _zoom)
3340 AprsDataRow *p_station = n_first;
3342 while ( (p_station) != NULL)
3344 if( p_station->coord_lat != 0.0f
3345 || p_station->coord_lon != 0.0f )
3347 plot_aprs_station( p_station, FALSE);
3350 (p_station) = (p_station)->n_next; // Next element in list
3351 } // End of while loop
3354 } // check for zoom level
3356 vprintf("%s(): return\n", __PRETTY_FUNCTION__);
3359 #endif // INCLUDE_APRS