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"
25 We should really do this by looking at the header row of the table.
26 They might decide to put in new columns some day.
73 char* fields[MAX_FIELDS];
78 show_message (char *message)
80 HildonNote* note = HILDON_NOTE
81 (hildon_note_new_information (GTK_WINDOW (window),
83 "Some message was supposed to be here."));
84 gtk_dialog_run (GTK_DIALOG (note));
85 gtk_widget_destroy (GTK_WIDGET (note));
89 call_dbus (DBusBusType type,
96 DBusGConnection *connection;
101 connection = dbus_g_bus_get (type,
103 if (connection == NULL)
105 show_message (error->message);
106 g_error_free (error);
110 proxy = dbus_g_proxy_new_for_name (connection, name, path, interface);
113 if (!dbus_g_proxy_call (proxy, method, &error,
114 G_TYPE_STRING, parameter,
118 show_message (error->message);
119 g_error_free (error);
124 show_browser (gchar *url)
126 call_dbus (DBUS_BUS_SESSION,
127 "com.nokia.osso_browser",
128 "/com/nokia/osso_browser/request",
129 "com.nokia.osso_browser",
134 typedef gboolean (*ParseDoveCallback)(tower *details, gpointer data);
135 typedef void (*ButtonCallback)(void);
137 GtkWidget *tower_window, *buttons, *tower_table;
141 add_table_field (char *name,
148 g_object_get(tower_table, "n-rows", &row);
152 gtk_table_resize (GTK_TABLE (tower_table), row, 2);
154 label = GTK_LABEL (gtk_label_new (NULL));
155 str = g_strdup_printf("<b>%s</b>", name);
156 gtk_label_set_markup (label, str);
158 gtk_label_set_justify (label, GTK_JUSTIFY_RIGHT);
159 gtk_table_attach_defaults (GTK_TABLE (tower_table),
163 label = GTK_LABEL (gtk_label_new (value));
164 gtk_label_set_justify (label, GTK_JUSTIFY_LEFT);
165 gtk_table_attach_defaults (GTK_TABLE (tower_table),
171 add_button (char *label,
172 ButtonCallback callback)
176 button = gtk_button_new_with_label (label);
177 g_signal_connect (button, "clicked", G_CALLBACK (callback), NULL);
178 hildon_app_menu_append (menu, GTK_BUTTON (button));
179 button = hildon_button_new_with_text (HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT,
180 HILDON_BUTTON_ARRANGEMENT_VERTICAL,
182 g_signal_connect (button, "clicked", G_CALLBACK (callback), NULL);
183 gtk_box_pack_end (GTK_BOX (buttons), button, FALSE, FALSE, 0);
188 bookmark_toggled (GtkButton *button,
191 show_message ("Bookmarks are not yet implemented.");
194 char *tower_website = NULL;
195 char *tower_map = NULL;
196 char *tower_directions = NULL;
197 char *peals_list = NULL;
200 show_tower_website (void)
202 show_browser (tower_website);
206 show_tower_map (void)
208 show_browser (tower_map);
212 show_peals_list (void)
214 show_browser (peals_list);
218 get_areas_cb (tower *details,
221 GHashTable *hash = (GHashTable *)data;
223 if (details->serial==0)
224 return TRUE; /* header row */
226 if (!g_hash_table_lookup_extended (hash,
227 details->fields[FieldCounty],
230 char *display_format;
232 if (strcmp (details->fields[FieldCounty], "")==0)
234 display_format = g_strdup (details->fields[FieldCountry]);
238 display_format = g_strdup_printf ("%s " EM_DASH " %s",
239 details->fields[FieldCountry],
240 details->fields[FieldCounty]);
243 g_hash_table_insert (hash,
244 g_strdup(details->fields[FieldCounty]),
252 single_tower_cb (tower *details,
256 GtkWidget *hbox, *button;
259 gchar *primary_key = (gchar*) data;
261 if (strcmp(details->fields[FieldPrimaryKey], primary_key)!=0)
263 /* not this one; keep going */
267 tower_window = hildon_stackable_window_new ();
269 if (g_str_has_prefix (details->fields[FieldDedication],
272 /* FIXME: This needs to be cleverer, because we can have
273 * e.g. "S Peter and S Paul".
274 * May have to use regexps.
275 * Reallocation in general even when unchanged is okay,
276 * because it's the common case (most towers are S Something)
279 /* FIXME: Since we're passing this in as markup,
280 * we need to escape the strings.
283 str = g_strdup_printf("S<sup>t</sup> %s, %s",
284 details->fields[FieldDedication]+2,
285 details->fields[FieldPlace]);
290 str = g_strdup_printf("%s, %s",
291 details->fields[FieldDedication],
292 details->fields[FieldPlace]);
295 hildon_window_set_markup (HILDON_WINDOW (tower_window),
299 hbox = gtk_hbox_new (FALSE, 0);
300 tower_table = gtk_table_new (0, 2, FALSE);
301 buttons = gtk_vbox_new (TRUE, 0);
302 menu = HILDON_APP_MENU (hildon_app_menu_new ());
304 add_table_field ("Postcode", details->fields[FieldPostcode]);
305 add_table_field ("County", details->fields[FieldCounty]);
306 add_table_field ("Country", details->fields[FieldCountry]);
307 add_table_field ("Diocese", details->fields[FieldDiocese]);
308 add_table_field ("Practice night", details->fields[FieldPracticeNight]);
309 add_table_field ("Bells", details->fields[FieldBells]);
311 tenor_weight = atoi (details->fields[FieldWt]);
312 str = g_strdup_printf("%dcwt %dqr %dlb in %s",
314 (tenor_weight % 112)/28,
316 details->fields[FieldNote]
318 add_table_field ("Tenor", str);
321 add_button ("Tower website", show_tower_website);
322 add_button ("Peals", show_peals_list);
323 add_button ("Map", show_tower_map);
324 add_button ("Directions", NULL);
326 /* don't use a toggle button: it looks stupid */
327 button = hildon_button_new_with_text (HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT,
328 HILDON_BUTTON_ARRANGEMENT_VERTICAL,
330 g_signal_connect (button, "clicked", G_CALLBACK (bookmark_toggled), NULL);
331 gtk_box_pack_start (GTK_BOX (buttons), button, FALSE, FALSE, 0);
333 gtk_widget_show_all (GTK_WIDGET (menu));
334 hildon_window_set_app_menu (HILDON_WINDOW (tower_window), menu);
336 gtk_box_pack_end (GTK_BOX (hbox), buttons, TRUE, TRUE, 0);
337 gtk_box_pack_end (GTK_BOX (hbox), tower_table, TRUE, TRUE, 0);
339 gtk_container_add (GTK_CONTAINER (tower_window), hbox);
341 g_free (tower_website);
342 tower_website = g_strdup_printf ("http://%s", details->fields[FieldWebPage]);
344 peals_list = g_strdup_printf ("http://www.pealbase.ismysite.co.uk/felstead/tbid.php?tid=%s",
345 details->fields[FieldTowerBase]);
347 tower_map = g_strdup_printf ("http://maps.google.com/maps?q=%s,%s",
348 details->fields[FieldLat],
349 details->fields[FieldLong]);
350 gtk_widget_show_all (GTK_WIDGET (tower_window));
356 parse_dove (ParseDoveCallback callback,
359 FILE *dove = fopen("/usr/share/belltower/dove.txt", "r");
360 char tower_rec[4096];
363 gboolean seen_newline;
367 show_message ("Cannot open Dove database!");
373 while (fgets (tower_rec, sizeof (tower_rec), dove))
375 seen_newline = FALSE;
376 result.fields[0] = tower_rec;
378 for (i=tower_rec; *i; i++) {
383 if (*i=='\\' || *i=='\n')
387 result.fields[result.n_fields] = i+1;
393 /* keep it simple, stupid */
394 show_message ("Line too long, cannot continue.");
398 if (strcmp (result.fields[FieldCountry], "")==0)
400 result.fields[FieldCountry] = "England";
403 if (!callback (&result, data))
419 LocationGPSDevice *device;
420 device = g_object_new (LOCATION_TYPE_GPS_DEVICE, NULL);
422 sprintf(buffer, "%f %f %x",
423 device->fix->latitude,
424 device->fix->longitude,
425 device->fix->fields);
426 show_message (buffer);
428 if (device->fix->fields & LOCATION_GPS_DEVICE_LATLONG_SET)
430 show_message ("I know where you are!");
434 show_message ("I don't know where you are!");
437 g_object_unref (device);
441 show_tower (char *primary_key)
443 parse_dove (single_tower_cb,
448 put_areas_into_list (gpointer key,
453 GtkListStore *list_store = (GtkListStore*) data;
454 gtk_list_store_append (list_store, &iter);
455 gtk_list_store_set (list_store, &iter,
461 towers_by_area (void)
463 GtkWidget *dialog = gtk_dialog_new ();
464 GtkWidget *vbox = GTK_DIALOG(dialog)->vbox;
465 GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();
466 GtkWidget *treeview = hildon_gtk_tree_view_new (HILDON_UI_MODE_NORMAL);
467 GtkWidget *pan = hildon_pannable_area_new ();
468 GtkListStore *list_store = gtk_list_store_new(1, G_TYPE_STRING);
470 GHashTable *hash = g_hash_table_new_full (g_str_hash,
474 parse_dove (get_areas_cb,
477 g_hash_table_foreach (hash,
481 /* g_signal_connect (G_OBJECT (dialog), "delete_event", G_CALLBACK (g_hash_table_destroy), hash)*/
483 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (list_store),
487 g_object_set (GTK_OBJECT(renderer), "yalign", 0.5, NULL);
488 g_object_set (GTK_OBJECT(renderer), "xpad", 24, NULL);
490 gtk_window_set_title (GTK_WINDOW (dialog), "Towers by area");
492 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
498 gtk_tree_view_set_model (GTK_TREE_VIEW (treeview),
499 GTK_TREE_MODEL (list_store));
501 g_object_unref (list_store);
503 hildon_pannable_area_add_with_viewport (HILDON_PANNABLE_AREA (pan),
506 hildon_pannable_area_set_size_request_policy (HILDON_PANNABLE_AREA (pan),
507 HILDON_SIZE_REQUEST_CHILDREN);
508 gtk_container_add(GTK_CONTAINER (vbox), pan);
510 gtk_widget_show_all (GTK_WIDGET (dialog));
512 gtk_dialog_run (GTK_DIALOG (dialog));
513 gtk_widget_destroy (GTK_WIDGET (dialog));
514 /* g_hash_table_unref (hash); */
519 show_bookmarks (void)
533 show_tower ("NORTON HE");
537 main(int argc, char **argv)
539 GtkWidget *bell, *button, *hbox;
540 GdkPixbuf *bell_picture;
542 gtk_init (&argc, &argv);
543 g_set_application_name ("Belltower");
545 window = hildon_stackable_window_new ();
546 gtk_window_set_title (GTK_WINDOW (window), "Belltower");
547 g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (gtk_main_quit), NULL);
549 bell_picture = gdk_pixbuf_new_from_file ("/usr/share/belltower/bells1.jpg", NULL);
551 buttons = gtk_vbox_new (TRUE, 0);
552 menu = HILDON_APP_MENU (hildon_app_menu_new ());
554 add_button ("Nearby", nearby_towers);
555 add_button ("Recent", recent_towers);
556 add_button ("Bookmarks", show_bookmarks);
557 add_button ("By area", towers_by_area);
558 add_button ("Search", tower_search);
560 /* extra buttons for the app menu */
561 button = gtk_button_new_with_label ("Credits");
562 hildon_app_menu_append (menu, GTK_BUTTON (button));
563 hildon_app_menu_append (menu, GTK_BUTTON (button));
565 gtk_widget_show_all (GTK_WIDGET (menu));
566 hildon_window_set_app_menu (HILDON_WINDOW (window), menu);
568 hbox = gtk_hbox_new (FALSE, 0);
569 gtk_box_pack_end (GTK_BOX (hbox), buttons, TRUE, TRUE, 0);
570 gtk_box_pack_end (GTK_BOX (hbox),
571 gtk_image_new_from_pixbuf (bell_picture),
574 gtk_container_add (GTK_CONTAINER (window), hbox);
575 gtk_widget_show_all (GTK_WIDGET (window));