3 * an app to find belltowers under Maemo 5
5 * Copyright (c) 2009 Thomas Thurman <tthurman@gnome.org>
6 * Released under the GPL
13 #include <hildon/hildon.h>
15 #include <location/location-gps-device.h>
16 #include <dbus/dbus-glib.h>
24 We should really do this by looking at the header row of the table.
25 They might decide to put in new columns some day.
72 char* fields[MAX_FIELDS];
77 show_message (char *message)
79 HildonNote* note = HILDON_NOTE
80 (hildon_note_new_information (GTK_WINDOW (window),
82 "Some message was supposed to be here."));
83 gtk_dialog_run (GTK_DIALOG (note));
84 gtk_widget_destroy (GTK_WIDGET (note));
88 call_dbus (DBusBusType type,
95 DBusGConnection *connection;
100 connection = dbus_g_bus_get (type,
102 if (connection == NULL)
104 show_message (error->message);
105 g_error_free (error);
109 proxy = dbus_g_proxy_new_for_name (connection, name, path, interface);
112 if (!dbus_g_proxy_call (proxy, method, &error,
113 G_TYPE_STRING, parameter,
117 show_message (error->message);
118 g_error_free (error);
123 show_browser (gchar *url)
125 call_dbus (DBUS_BUS_SESSION,
126 "com.nokia.osso_browser",
127 "/com/nokia/osso_browser/request",
128 "com.nokia.osso_browser",
133 typedef gboolean (*ParseDoveCallback)(tower *details, gpointer data);
134 typedef void (*ButtonCallback)(void);
136 GtkWidget *tower_window, *buttons, *tower_table;
140 add_table_field (char *name,
147 g_object_get(tower_table, "n-rows", &row);
151 gtk_table_resize (GTK_TABLE (tower_table), row, 2);
153 label = GTK_LABEL (gtk_label_new (NULL));
154 str = g_strdup_printf("<b>%s</b>", name);
155 gtk_label_set_markup (label, str);
157 gtk_label_set_justify (label, GTK_JUSTIFY_RIGHT);
158 gtk_table_attach_defaults (GTK_TABLE (tower_table),
162 label = GTK_LABEL (gtk_label_new (value));
163 gtk_label_set_justify (label, GTK_JUSTIFY_LEFT);
164 gtk_table_attach_defaults (GTK_TABLE (tower_table),
170 add_button (char *label,
171 ButtonCallback callback)
175 button = gtk_button_new_with_label (label);
176 g_signal_connect (button, "clicked", G_CALLBACK (callback), NULL);
177 hildon_app_menu_append (menu, GTK_BUTTON (button));
178 button = hildon_button_new_with_text (HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT,
179 HILDON_BUTTON_ARRANGEMENT_VERTICAL,
181 g_signal_connect (button, "clicked", G_CALLBACK (callback), NULL);
182 gtk_box_pack_end (GTK_BOX (buttons), button, FALSE, FALSE, 0);
187 bookmark_toggled (GtkButton *button,
190 show_message ("Bookmarks are not yet implemented.");
193 char *tower_website = NULL;
194 char *tower_map = NULL;
195 char *tower_directions = NULL;
196 char *peals_list = NULL;
199 show_tower_website (void)
201 show_browser (tower_website);
205 show_tower_map (void)
207 show_browser (tower_map);
211 show_peals_list (void)
213 show_browser (peals_list);
217 get_countries_cb (tower *details,
220 GHashTable *hash = (GHashTable *)data;
222 if (details->serial==0)
223 return TRUE; /* header row */
225 if (!g_hash_table_lookup_extended (hash,
226 details->fields[FieldCountry],
229 g_hash_table_insert (hash,
230 g_strdup(details->fields[FieldCountry]),
231 g_strdup (details->fields[FieldCountry]));
243 get_counties_cb (tower *details,
246 country_cb_data *d = (country_cb_data *)data;
248 if (details->serial==0)
249 return TRUE; /* header row */
251 if (strcmp(details->fields[FieldCountry], d->country_name)!=0)
252 return TRUE; /* wrong country */
254 if (!g_hash_table_lookup_extended (d->hash,
255 details->fields[FieldCounty],
258 g_hash_table_insert (d->hash,
259 g_strdup(details->fields[FieldCounty]),
260 g_strdup (details->fields[FieldCounty]));
267 single_tower_cb (tower *details,
271 GtkWidget *hbox, *button;
274 gchar *primary_key = (gchar*) data;
276 if (strcmp(details->fields[FieldPrimaryKey], primary_key)!=0)
278 /* not this one; keep going */
282 tower_window = hildon_stackable_window_new ();
284 if (g_str_has_prefix (details->fields[FieldDedication],
287 /* FIXME: This needs to be cleverer, because we can have
288 * e.g. "S Peter and S Paul".
289 * May have to use regexps.
290 * Reallocation in general even when unchanged is okay,
291 * because it's the common case (most towers are S Something)
294 /* FIXME: Since we're passing this in as markup,
295 * we need to escape the strings.
298 str = g_strdup_printf("S<sup>t</sup> %s, %s",
299 details->fields[FieldDedication]+2,
300 details->fields[FieldPlace]);
305 str = g_strdup_printf("%s, %s",
306 details->fields[FieldDedication],
307 details->fields[FieldPlace]);
310 hildon_window_set_markup (HILDON_WINDOW (tower_window),
314 hbox = gtk_hbox_new (FALSE, 0);
315 tower_table = gtk_table_new (0, 2, FALSE);
316 buttons = gtk_vbox_new (TRUE, 0);
317 menu = HILDON_APP_MENU (hildon_app_menu_new ());
319 add_table_field ("Postcode", details->fields[FieldPostcode]);
320 add_table_field ("County", details->fields[FieldCounty]);
321 add_table_field ("Country", details->fields[FieldCountry]);
322 add_table_field ("Diocese", details->fields[FieldDiocese]);
323 add_table_field ("Practice night", details->fields[FieldPracticeNight]);
324 add_table_field ("Bells", details->fields[FieldBells]);
326 tenor_weight = atoi (details->fields[FieldWt]);
327 str = g_strdup_printf("%dcwt %dqr %dlb in %s",
329 (tenor_weight % 112)/28,
331 details->fields[FieldNote]
333 add_table_field ("Tenor", str);
336 add_button ("Tower website", show_tower_website);
337 add_button ("Peals", show_peals_list);
338 add_button ("Map", show_tower_map);
339 add_button ("Directions", NULL);
341 /* don't use a toggle button: it looks stupid */
342 button = hildon_button_new_with_text (HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT,
343 HILDON_BUTTON_ARRANGEMENT_VERTICAL,
345 g_signal_connect (button, "clicked", G_CALLBACK (bookmark_toggled), NULL);
346 gtk_box_pack_start (GTK_BOX (buttons), button, FALSE, FALSE, 0);
348 gtk_widget_show_all (GTK_WIDGET (menu));
349 hildon_window_set_app_menu (HILDON_WINDOW (tower_window), menu);
351 gtk_box_pack_end (GTK_BOX (hbox), buttons, TRUE, TRUE, 0);
352 gtk_box_pack_end (GTK_BOX (hbox), tower_table, TRUE, TRUE, 0);
354 gtk_container_add (GTK_CONTAINER (tower_window), hbox);
356 g_free (tower_website);
357 tower_website = g_strdup_printf ("http://%s", details->fields[FieldWebPage]);
359 peals_list = g_strdup_printf ("http://www.pealbase.ismysite.co.uk/felstead/tbid.php?tid=%s",
360 details->fields[FieldTowerBase]);
362 tower_map = g_strdup_printf ("http://maps.google.com/maps?q=%s,%s",
363 details->fields[FieldLat],
364 details->fields[FieldLong]);
365 gtk_widget_show_all (GTK_WIDGET (tower_window));
371 parse_dove (ParseDoveCallback callback,
374 FILE *dove = fopen("/usr/share/belltower/dove.txt", "r");
375 char tower_rec[4096];
378 gboolean seen_newline;
382 show_message ("Cannot open Dove database!");
388 while (fgets (tower_rec, sizeof (tower_rec), dove))
390 seen_newline = FALSE;
391 result.fields[0] = tower_rec;
393 for (i=tower_rec; *i; i++) {
398 if (*i=='\\' || *i=='\n')
402 result.fields[result.n_fields] = i+1;
408 /* keep it simple, stupid */
409 show_message ("Line too long, cannot continue.");
413 if (strcmp (result.fields[FieldCountry], "")==0)
415 result.fields[FieldCountry] = "England";
418 if (!callback (&result, data))
434 LocationGPSDevice *device;
435 device = g_object_new (LOCATION_TYPE_GPS_DEVICE, NULL);
437 sprintf(buffer, "%f %f %x",
438 device->fix->latitude,
439 device->fix->longitude,
440 device->fix->fields);
441 show_message (buffer);
443 if (device->fix->fields & LOCATION_GPS_DEVICE_LATLONG_SET)
445 show_message ("I know where you are!");
449 show_message ("I don't know where you are!");
452 g_object_unref (device);
456 show_tower (char *primary_key)
458 parse_dove (single_tower_cb,
462 static gint strcmp_f (gconstpointer a,
465 return strcmp ((char*)a, (char*)b);
469 put_areas_into_list (gpointer key,
473 GSList **list = (GSList **)data;
474 *list = g_slist_insert_sorted (*list,
480 towers_by_subarea (gchar *area)
482 GtkWidget *dialog = hildon_picker_dialog_new (GTK_WINDOW (window));
484 GtkWidget *selector = hildon_touch_selector_new_text ();
486 GHashTable *hash = g_hash_table_new_full (g_str_hash,
491 GSList *list=NULL, *cursor;
493 gchar *title = g_strdup_printf ("Areas of %s", area);
495 country_cb_data d = { hash, area };
497 gtk_window_set_title (GTK_WINDOW (dialog), title);
500 parse_dove (get_counties_cb,
503 g_hash_table_foreach (hash,
507 for (cursor=list; cursor; cursor=cursor->next)
509 hildon_touch_selector_append_text (HILDON_TOUCH_SELECTOR (selector),
513 hildon_picker_dialog_set_selector (HILDON_PICKER_DIALOG (dialog),
514 HILDON_TOUCH_SELECTOR (selector));
516 gtk_widget_show_all (GTK_WIDGET (dialog));
518 if (gtk_dialog_run (GTK_DIALOG (dialog))==GTK_RESPONSE_OK)
520 show_message (hildon_touch_selector_get_current_text (HILDON_TOUCH_SELECTOR (selector)));
522 g_hash_table_unref (hash);
523 gtk_widget_destroy (GTK_WIDGET (dialog));
527 towers_by_area (void)
529 GtkWidget *dialog = hildon_picker_dialog_new (GTK_WINDOW (window));
530 GtkWidget *selector = hildon_touch_selector_new_text ();
531 GHashTable *hash = g_hash_table_new_full (g_str_hash,
535 GSList *list = NULL, *cursor;
536 gchar *result = NULL;
538 gtk_window_set_title (GTK_WINDOW (dialog), "Areas of the world");
540 parse_dove (get_countries_cb,
543 g_hash_table_foreach (hash,
547 for (cursor=list; cursor; cursor=cursor->next)
549 hildon_touch_selector_append_text (HILDON_TOUCH_SELECTOR (selector),
553 hildon_picker_dialog_set_selector (HILDON_PICKER_DIALOG (dialog),
554 HILDON_TOUCH_SELECTOR (selector));
556 gtk_widget_show_all (GTK_WIDGET (dialog));
558 if (gtk_dialog_run (GTK_DIALOG (dialog))==GTK_RESPONSE_OK)
560 result = g_strdup (hildon_touch_selector_get_current_text (HILDON_TOUCH_SELECTOR (selector)));
562 g_hash_table_unref (hash);
563 gtk_widget_destroy (GTK_WIDGET (dialog));
567 towers_by_subarea (result);
573 show_bookmarks (void)
587 show_tower ("NORTON HE");
591 main(int argc, char **argv)
593 GtkWidget *bell, *button, *hbox;
594 GdkPixbuf *bell_picture;
596 gtk_init (&argc, &argv);
597 g_set_application_name ("Belltower");
599 window = hildon_stackable_window_new ();
600 gtk_window_set_title (GTK_WINDOW (window), "Belltower");
601 g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (gtk_main_quit), NULL);
603 bell_picture = gdk_pixbuf_new_from_file ("/usr/share/belltower/bells1.jpg", NULL);
605 buttons = gtk_vbox_new (TRUE, 0);
606 menu = HILDON_APP_MENU (hildon_app_menu_new ());
608 add_button ("Nearby", nearby_towers);
609 add_button ("Recent", recent_towers);
610 add_button ("Bookmarks", show_bookmarks);
611 add_button ("By area", towers_by_area);
612 add_button ("Search", tower_search);
614 /* extra buttons for the app menu */
615 button = gtk_button_new_with_label ("Credits");
616 hildon_app_menu_append (menu, GTK_BUTTON (button));
617 hildon_app_menu_append (menu, GTK_BUTTON (button));
619 gtk_widget_show_all (GTK_WIDGET (menu));
620 hildon_window_set_app_menu (HILDON_WINDOW (window), menu);
622 hbox = gtk_hbox_new (FALSE, 0);
623 gtk_box_pack_end (GTK_BOX (hbox), buttons, TRUE, TRUE, 0);
624 gtk_box_pack_end (GTK_BOX (hbox),
625 gtk_image_new_from_pixbuf (bell_picture),
628 gtk_container_add (GTK_CONTAINER (window), hbox);
629 gtk_widget_show_all (GTK_WIDGET (window));