3 * an app to find belltowers under Maemo 5
5 * Copyright (c) 2009 Thomas Thurman <tthurman@gnome.org>
6 * Released under the GPL
12 #include <hildon/hildon.h>
14 #include <location/location-gps-device.h>
15 #include <dbus/dbus-glib.h>
19 #define EM_DASH "\xE2\x80\x94"
68 char* fields[MAX_FIELDS];
73 show_message (char *message)
75 HildonNote* note = HILDON_NOTE
76 (hildon_note_new_information (GTK_WINDOW (window),
78 "Some message was supposed to be here."));
79 gtk_dialog_run (GTK_DIALOG (note));
80 gtk_widget_destroy (GTK_WIDGET (note));
84 call_dbus (DBusBusType type,
91 DBusGConnection *connection;
96 connection = dbus_g_bus_get (type,
98 if (connection == NULL)
100 show_message (error->message);
101 g_error_free (error);
105 proxy = dbus_g_proxy_new_for_name (connection, name, path, interface);
108 if (!dbus_g_proxy_call (proxy, method, &error,
109 G_TYPE_STRING, parameter,
113 show_message (error->message);
114 g_error_free (error);
119 show_browser (gchar *url)
121 call_dbus (DBUS_BUS_SESSION,
122 "com.nokia.osso_browser",
123 "/com/nokia/osso_browser/request",
124 "com.nokia.osso_browser",
129 typedef gboolean (*ParseDoveCallback)(tower *details, gpointer data);
130 typedef void (*ButtonCallback)(void);
132 GtkWidget *tower_window, *buttons, *tower_table;
136 add_table_field (char *name,
143 g_object_get(tower_table, "n-rows", &row);
147 gtk_table_resize (GTK_TABLE (tower_table), row, 2);
149 label = GTK_LABEL (gtk_label_new (NULL));
150 str = g_strdup_printf("<b>%s</b>", name);
151 gtk_label_set_markup (label, str);
153 gtk_label_set_justify (label, GTK_JUSTIFY_RIGHT);
154 gtk_table_attach_defaults (GTK_TABLE (tower_table),
158 label = GTK_LABEL (gtk_label_new (value));
159 gtk_label_set_justify (label, GTK_JUSTIFY_LEFT);
160 gtk_table_attach_defaults (GTK_TABLE (tower_table),
166 add_button (char *label,
167 ButtonCallback callback)
171 button = gtk_button_new_with_label (label);
172 g_signal_connect (button, "clicked", G_CALLBACK (callback), NULL);
173 hildon_app_menu_append (menu, GTK_BUTTON (button));
174 button = hildon_button_new_with_text (HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT,
175 HILDON_BUTTON_ARRANGEMENT_VERTICAL,
177 g_signal_connect (button, "clicked", G_CALLBACK (callback), NULL);
178 gtk_box_pack_end (GTK_BOX (buttons), button, FALSE, FALSE, 0);
183 bookmark_toggled (GtkButton *button,
186 show_message ("Bookmarks are not yet implemented.");
189 char *tower_website = NULL;
190 char *tower_map = NULL;
191 char *tower_directions = NULL;
192 char *peals_list = NULL;
195 show_tower_website (void)
197 show_browser (tower_website);
201 show_tower_map (void)
203 show_browser (tower_map);
207 show_peals_list (void)
209 show_browser (peals_list);
213 get_areas_cb (tower *details,
216 GHashTable *hash = (GHashTable *)data;
219 if (details->serial==0)
220 return TRUE; /* header row */
222 if (!g_hash_table_lookup_extended (hash,
223 details->fields[FieldCounty],
226 char *display_format;
228 if (strcmp (details->fields[FieldCounty], "")==0)
230 display_format = g_strdup (details->fields[FieldCountry]);
234 display_format = g_strdup_printf ("%s " EM_DASH " %s",
235 details->fields[FieldCountry],
236 details->fields[FieldCounty]);
239 g_hash_table_insert (hash,
240 g_strdup(details->fields[FieldCounty]),
248 single_tower_cb (tower *details,
252 GtkWidget *hbox, *button;
255 gchar *primary_key = (gchar*) data;
257 if (strcmp(details->fields[FieldPrimaryKey], primary_key)!=0)
259 /* not this one; keep going */
263 tower_window = hildon_stackable_window_new ();
265 if (g_str_has_prefix (details->fields[FieldDedication],
268 /* FIXME: This needs to be cleverer, because we can have
269 * e.g. "S Peter and S Paul".
270 * May have to use regexps.
271 * Reallocation in general even when unchanged is okay,
272 * because it's the common case (most towers are S Something)
275 /* FIXME: Since we're passing this in as markup,
276 * we need to escape the strings.
279 str = g_strdup_printf("S<sup>t</sup> %s, %s",
280 details->fields[FieldDedication]+2,
281 details->fields[FieldPlace]);
286 str = g_strdup_printf("%s, %s",
287 details->fields[FieldDedication],
288 details->fields[FieldPlace]);
291 hildon_window_set_markup (HILDON_WINDOW (tower_window),
295 hbox = gtk_hbox_new (FALSE, 0);
296 tower_table = gtk_table_new (0, 2, FALSE);
297 buttons = gtk_vbox_new (TRUE, 0);
298 menu = HILDON_APP_MENU (hildon_app_menu_new ());
300 add_table_field ("Postcode", details->fields[FieldPostcode]);
301 add_table_field ("County", details->fields[FieldCounty]);
302 add_table_field ("Country", details->fields[FieldCountry]);
303 add_table_field ("Diocese", details->fields[FieldDiocese]);
304 add_table_field ("Practice night", details->fields[FieldPracticeNight]);
305 add_table_field ("Bells", details->fields[FieldBells]);
307 tenor_weight = atoi (details->fields[FieldWt]);
308 str = g_strdup_printf("%dcwt %dqr %dlb in %s",
310 (tenor_weight % 112)/28,
312 details->fields[FieldNote]
314 add_table_field ("Tenor", str);
317 add_button ("Tower website", show_tower_website);
318 add_button ("Peals", show_peals_list);
319 add_button ("Map", show_tower_map);
320 add_button ("Directions", NULL);
322 /* don't use a toggle button: it looks stupid */
323 button = hildon_button_new_with_text (HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT,
324 HILDON_BUTTON_ARRANGEMENT_VERTICAL,
326 g_signal_connect (button, "clicked", G_CALLBACK (bookmark_toggled), NULL);
327 gtk_box_pack_start (GTK_BOX (buttons), button, FALSE, FALSE, 0);
329 gtk_widget_show_all (GTK_WIDGET (menu));
330 hildon_window_set_app_menu (HILDON_WINDOW (tower_window), menu);
332 gtk_box_pack_end (GTK_BOX (hbox), buttons, TRUE, TRUE, 0);
333 gtk_box_pack_end (GTK_BOX (hbox), tower_table, TRUE, TRUE, 0);
335 gtk_container_add (GTK_CONTAINER (tower_window), hbox);
337 g_free (tower_website);
338 tower_website = g_strdup_printf ("http://%s", details->fields[FieldWebPage]);
340 peals_list = g_strdup_printf ("http://www.pealbase.ismysite.co.uk/felstead/tbid.php?tid=%s",
341 details->fields[FieldTowerBase]);
343 tower_map = g_strdup_printf ("http://maps.google.com/maps?q=%s,%s",
344 details->fields[FieldLat],
345 details->fields[FieldLong]);
346 gtk_widget_show_all (GTK_WIDGET (tower_window));
352 parse_dove (ParseDoveCallback callback,
355 FILE *dove = fopen("/usr/share/belltower/dove.txt", "r");
356 char tower_rec[4096];
359 gboolean seen_newline;
363 show_message ("Cannot open Dove database!");
369 while (fgets (tower_rec, sizeof (tower_rec), dove))
371 seen_newline = FALSE;
372 result.fields[0] = tower_rec;
374 for (i=tower_rec; *i; i++) {
379 if (*i=='\\' || *i=='\n')
383 result.fields[result.n_fields] = i+1;
389 /* keep it simple, stupid */
390 show_message ("Line too long, cannot continue.");
394 if (strcmp (result.fields[FieldCountry], "")==0)
396 result.fields[FieldCountry] = "England";
399 if (!callback (&result, data))
413 LocationGPSDevice *device;
414 device = g_object_new (LOCATION_TYPE_GPS_DEVICE, NULL);
416 sprintf(buffer, "%f %f %x",
417 device->fix->latitude,
418 device->fix->longitude,
419 device->fix->fields);
420 show_message (buffer);
422 if (device->fix->fields & LOCATION_GPS_DEVICE_LATLONG_SET)
424 show_message ("I know where you are!");
428 show_message ("I don't know where you are!");
431 g_object_unref (device);
435 show_tower (char *primary_key)
437 parse_dove (single_tower_cb,
442 put_areas_into_list (gpointer key,
447 GtkListStore *list_store = (GtkListStore*) data;
448 gtk_list_store_append (list_store, &iter);
449 gtk_list_store_set (list_store, &iter,
455 towers_by_area (void)
457 GtkWidget *dialog = gtk_dialog_new ();
458 GtkWidget *vbox = GTK_DIALOG(dialog)->vbox;
459 GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();
460 GtkWidget *treeview = hildon_gtk_tree_view_new (HILDON_UI_MODE_NORMAL);
461 GtkWidget *pan = hildon_pannable_area_new ();
462 GtkListStore *list_store = gtk_list_store_new(1, G_TYPE_STRING);
464 GHashTable *hash = g_hash_table_new_full (g_str_hash,
472 parse_dove (get_areas_cb,
475 g_hash_table_foreach (hash,
479 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (list_store),
483 g_object_set (GTK_OBJECT(renderer), "yalign", 0.5, NULL);
484 g_object_set (GTK_OBJECT(renderer), "xpad", 24, NULL);
486 gtk_window_set_title (GTK_WINDOW (dialog), "Towers by area");
488 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
494 gtk_tree_view_set_model (GTK_TREE_VIEW (treeview),
495 GTK_TREE_MODEL (list_store));
496 g_object_unref (list_store);
498 hildon_pannable_area_add_with_viewport (HILDON_PANNABLE_AREA (pan),
501 gtk_widget_set_size_request (treeview, 480, 800);
502 hildon_pannable_area_set_size_request_policy (HILDON_PANNABLE_AREA (pan),
503 HILDON_SIZE_REQUEST_CHILDREN);
504 gtk_container_add(GTK_CONTAINER (vbox), pan);
506 gtk_widget_show_all (GTK_WIDGET (dialog));
508 gtk_dialog_run (GTK_DIALOG (dialog));
509 gtk_widget_destroy (GTK_WIDGET (dialog));
513 show_bookmarks (void)
527 show_tower ("NORTON HE");
531 main(int argc, char **argv)
533 GtkWidget *bell, *button, *hbox;
534 GdkPixbuf *bell_picture;
536 gtk_init (&argc, &argv);
537 g_set_application_name ("Belltower");
539 window = hildon_stackable_window_new ();
540 gtk_window_set_title (GTK_WINDOW (window), "Belltower");
541 g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (gtk_main_quit), NULL);
543 bell_picture = gdk_pixbuf_new_from_file ("/usr/share/belltower/bells1.jpg", NULL);
545 buttons = gtk_vbox_new (TRUE, 0);
546 menu = HILDON_APP_MENU (hildon_app_menu_new ());
548 add_button ("Nearby", nearby_towers);
549 add_button ("Recent", recent_towers);
550 add_button ("Bookmarks", show_bookmarks);
551 add_button ("By area", towers_by_area);
552 add_button ("Search", tower_search);
554 /* extra buttons for the app menu */
555 button = gtk_button_new_with_label ("Credits");
556 hildon_app_menu_append (menu, GTK_BUTTON (button));
557 hildon_app_menu_append (menu, GTK_BUTTON (button));
559 gtk_widget_show_all (GTK_WIDGET (menu));
560 hildon_window_set_app_menu (HILDON_WINDOW (window), menu);
562 hbox = gtk_hbox_new (FALSE, 0);
563 gtk_box_pack_end (GTK_BOX (hbox), buttons, TRUE, TRUE, 0);
564 gtk_box_pack_end (GTK_BOX (hbox),
565 gtk_image_new_from_pixbuf (bell_picture),
568 gtk_container_add (GTK_CONTAINER (window), hbox);
569 gtk_widget_show_all (GTK_WIDGET (window));