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>
20 #define EM_DASH "\xE2\x80\x94"
26 We should really do this by looking at the header row of the table.
27 They might decide to put in new columns some day.
74 char* fields[MAX_FIELDS];
79 show_message (char *message)
81 HildonNote* note = HILDON_NOTE
82 (hildon_note_new_information (GTK_WINDOW (window),
84 "Some message was supposed to be here."));
85 gtk_dialog_run (GTK_DIALOG (note));
86 gtk_widget_destroy (GTK_WIDGET (note));
90 call_dbus (DBusBusType type,
97 DBusGConnection *connection;
102 connection = dbus_g_bus_get (type,
104 if (connection == NULL)
106 show_message (error->message);
107 g_error_free (error);
111 proxy = dbus_g_proxy_new_for_name (connection, name, path, interface);
114 if (!dbus_g_proxy_call (proxy, method, &error,
115 G_TYPE_STRING, parameter,
119 show_message (error->message);
120 g_error_free (error);
125 show_browser (gchar *url)
127 call_dbus (DBUS_BUS_SESSION,
128 "com.nokia.osso_browser",
129 "/com/nokia/osso_browser/request",
130 "com.nokia.osso_browser",
135 typedef gboolean (*ParseDoveCallback)(tower *details, gpointer data);
136 typedef void (*ButtonCallback)(void);
138 GtkWidget *tower_window, *buttons, *tower_table;
142 add_table_field (char *name,
149 g_object_get(tower_table, "n-rows", &row);
153 gtk_table_resize (GTK_TABLE (tower_table), row, 2);
155 label = GTK_LABEL (gtk_label_new (NULL));
156 str = g_strdup_printf("<b>%s</b>", name);
157 gtk_label_set_markup (label, str);
159 gtk_label_set_justify (label, GTK_JUSTIFY_RIGHT);
160 gtk_table_attach_defaults (GTK_TABLE (tower_table),
164 label = GTK_LABEL (gtk_label_new (value));
165 gtk_label_set_justify (label, GTK_JUSTIFY_LEFT);
166 gtk_table_attach_defaults (GTK_TABLE (tower_table),
172 add_button (char *label,
173 ButtonCallback callback)
177 button = gtk_button_new_with_label (label);
178 g_signal_connect (button, "clicked", G_CALLBACK (callback), NULL);
179 hildon_app_menu_append (menu, GTK_BUTTON (button));
180 button = hildon_button_new_with_text (HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT,
181 HILDON_BUTTON_ARRANGEMENT_VERTICAL,
183 g_signal_connect (button, "clicked", G_CALLBACK (callback), NULL);
184 gtk_box_pack_end (GTK_BOX (buttons), button, FALSE, FALSE, 0);
189 bookmark_toggled (GtkButton *button,
192 show_message ("Bookmarks are not yet implemented.");
195 char *tower_website = NULL;
196 char *tower_map = NULL;
197 char *tower_directions = NULL;
198 char *peals_list = NULL;
201 show_tower_website (void)
203 show_browser (tower_website);
207 show_tower_map (void)
209 show_browser (tower_map);
213 show_peals_list (void)
215 show_browser (peals_list);
219 get_areas_cb (tower *details,
222 GHashTable *hash = (GHashTable *)data;
224 if (details->serial==0)
225 return TRUE; /* header row */
227 if (!g_hash_table_lookup_extended (hash,
228 details->fields[FieldCounty],
231 char *display_format;
233 if (strcmp (details->fields[FieldCounty], "")==0)
235 display_format = g_strdup (details->fields[FieldCountry]);
239 display_format = g_strdup_printf ("%s " EM_DASH " %s",
240 details->fields[FieldCountry],
241 details->fields[FieldCounty]);
244 g_hash_table_insert (hash,
245 g_strdup(details->fields[FieldCounty]),
253 single_tower_cb (tower *details,
257 GtkWidget *hbox, *button;
260 gchar *primary_key = (gchar*) data;
262 if (strcmp(details->fields[FieldPrimaryKey], primary_key)!=0)
264 /* not this one; keep going */
268 tower_window = hildon_stackable_window_new ();
270 if (g_str_has_prefix (details->fields[FieldDedication],
273 /* FIXME: This needs to be cleverer, because we can have
274 * e.g. "S Peter and S Paul".
275 * May have to use regexps.
276 * Reallocation in general even when unchanged is okay,
277 * because it's the common case (most towers are S Something)
280 /* FIXME: Since we're passing this in as markup,
281 * we need to escape the strings.
284 str = g_strdup_printf("S<sup>t</sup> %s, %s",
285 details->fields[FieldDedication]+2,
286 details->fields[FieldPlace]);
291 str = g_strdup_printf("%s, %s",
292 details->fields[FieldDedication],
293 details->fields[FieldPlace]);
296 hildon_window_set_markup (HILDON_WINDOW (tower_window),
300 hbox = gtk_hbox_new (FALSE, 0);
301 tower_table = gtk_table_new (0, 2, FALSE);
302 buttons = gtk_vbox_new (TRUE, 0);
303 menu = HILDON_APP_MENU (hildon_app_menu_new ());
305 add_table_field ("Postcode", details->fields[FieldPostcode]);
306 add_table_field ("County", details->fields[FieldCounty]);
307 add_table_field ("Country", details->fields[FieldCountry]);
308 add_table_field ("Diocese", details->fields[FieldDiocese]);
309 add_table_field ("Practice night", details->fields[FieldPracticeNight]);
310 add_table_field ("Bells", details->fields[FieldBells]);
312 tenor_weight = atoi (details->fields[FieldWt]);
313 str = g_strdup_printf("%dcwt %dqr %dlb in %s",
315 (tenor_weight % 112)/28,
317 details->fields[FieldNote]
319 add_table_field ("Tenor", str);
322 add_button ("Tower website", show_tower_website);
323 add_button ("Peals", show_peals_list);
324 add_button ("Map", show_tower_map);
325 add_button ("Directions", NULL);
327 /* don't use a toggle button: it looks stupid */
328 button = hildon_button_new_with_text (HILDON_SIZE_AUTO_WIDTH | HILDON_SIZE_FINGER_HEIGHT,
329 HILDON_BUTTON_ARRANGEMENT_VERTICAL,
331 g_signal_connect (button, "clicked", G_CALLBACK (bookmark_toggled), NULL);
332 gtk_box_pack_start (GTK_BOX (buttons), button, FALSE, FALSE, 0);
334 gtk_widget_show_all (GTK_WIDGET (menu));
335 hildon_window_set_app_menu (HILDON_WINDOW (tower_window), menu);
337 gtk_box_pack_end (GTK_BOX (hbox), buttons, TRUE, TRUE, 0);
338 gtk_box_pack_end (GTK_BOX (hbox), tower_table, TRUE, TRUE, 0);
340 gtk_container_add (GTK_CONTAINER (tower_window), hbox);
342 g_free (tower_website);
343 tower_website = g_strdup_printf ("http://%s", details->fields[FieldWebPage]);
345 peals_list = g_strdup_printf ("http://www.pealbase.ismysite.co.uk/felstead/tbid.php?tid=%s",
346 details->fields[FieldTowerBase]);
348 tower_map = g_strdup_printf ("http://maps.google.com/maps?q=%s,%s",
349 details->fields[FieldLat],
350 details->fields[FieldLong]);
351 gtk_widget_show_all (GTK_WIDGET (tower_window));
357 parse_dove (ParseDoveCallback callback,
360 FILE *dove = fopen("/usr/share/belltower/dove.txt", "r");
361 char tower_rec[4096];
364 gboolean seen_newline;
368 show_message ("Cannot open Dove database!");
374 while (fgets (tower_rec, sizeof (tower_rec), dove))
376 seen_newline = FALSE;
377 result.fields[0] = tower_rec;
379 for (i=tower_rec; *i; i++) {
384 if (*i=='\\' || *i=='\n')
388 result.fields[result.n_fields] = i+1;
394 /* keep it simple, stupid */
395 show_message ("Line too long, cannot continue.");
399 if (strcmp (result.fields[FieldCountry], "")==0)
401 result.fields[FieldCountry] = "England";
404 if (!callback (&result, data))
420 LocationGPSDevice *device;
421 device = g_object_new (LOCATION_TYPE_GPS_DEVICE, NULL);
423 sprintf(buffer, "%f %f %x",
424 device->fix->latitude,
425 device->fix->longitude,
426 device->fix->fields);
427 show_message (buffer);
429 if (device->fix->fields & LOCATION_GPS_DEVICE_LATLONG_SET)
431 show_message ("I know where you are!");
435 show_message ("I don't know where you are!");
438 g_object_unref (device);
442 show_tower (char *primary_key)
444 parse_dove (single_tower_cb,
448 static gint strcmp_f (gconstpointer a,
451 return strcmp ((char*)a, (char*)b);
455 put_areas_into_list (gpointer key,
459 GSList **list = (GSList **)data;
460 *list = g_slist_insert_sorted (*list,
466 area_activated (GtkTreeView *treeview,
468 GtkTreeViewColumn *column,
471 GtkTreeModel *model = gtk_tree_view_get_model (treeview);
474 if (gtk_tree_model_get_iter (model, &iter, path))
477 gtk_tree_model_get (model, &iter, 0, &r, -1);
486 towers_by_area (void)
488 GtkWidget *dialog = hildon_picker_dialog_new (GTK_WINDOW (window));
489 GtkWidget *vbox = GTK_DIALOG(dialog)->vbox;
490 GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();
491 GtkWidget *treeview = hildon_gtk_tree_view_new (HILDON_UI_MODE_NORMAL);
492 GtkWidget *pan = hildon_pannable_area_new ();
493 GtkListStore *list_store = gtk_list_store_new(1, G_TYPE_STRING);
495 GtkWidget *selector = hildon_touch_selector_new_text ();
497 GHashTable *hash = g_hash_table_new_full (g_str_hash,
502 GSList *list, *cursor;
504 parse_dove (get_areas_cb,
507 g_hash_table_foreach (hash,
511 for (cursor=list; cursor; cursor=cursor->next)
513 hildon_touch_selector_append_text (HILDON_TOUCH_SELECTOR (selector),
517 hildon_picker_dialog_set_selector (HILDON_PICKER_DIALOG (dialog),
518 HILDON_TOUCH_SELECTOR (selector));
520 gtk_widget_show_all (GTK_WIDGET (dialog));
522 gtk_dialog_run (GTK_DIALOG (dialog));
523 show_message (hildon_touch_selector_get_current_text (HILDON_TOUCH_SELECTOR (selector)));
524 gtk_widget_destroy (GTK_WIDGET (dialog));
525 /* g_hash_table_unref (hash); */
530 show_bookmarks (void)
544 show_tower ("NORTON HE");
548 main(int argc, char **argv)
550 GtkWidget *bell, *button, *hbox;
551 GdkPixbuf *bell_picture;
553 gtk_init (&argc, &argv);
554 g_set_application_name ("Belltower");
556 window = hildon_stackable_window_new ();
557 gtk_window_set_title (GTK_WINDOW (window), "Belltower");
558 g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (gtk_main_quit), NULL);
560 bell_picture = gdk_pixbuf_new_from_file ("/usr/share/belltower/bells1.jpg", NULL);
562 buttons = gtk_vbox_new (TRUE, 0);
563 menu = HILDON_APP_MENU (hildon_app_menu_new ());
565 add_button ("Nearby", nearby_towers);
566 add_button ("Recent", recent_towers);
567 add_button ("Bookmarks", show_bookmarks);
568 add_button ("By area", towers_by_area);
569 add_button ("Search", tower_search);
571 /* extra buttons for the app menu */
572 button = gtk_button_new_with_label ("Credits");
573 hildon_app_menu_append (menu, GTK_BUTTON (button));
574 hildon_app_menu_append (menu, GTK_BUTTON (button));
576 gtk_widget_show_all (GTK_WIDGET (menu));
577 hildon_window_set_app_menu (HILDON_WINDOW (window), menu);
579 hbox = gtk_hbox_new (FALSE, 0);
580 gtk_box_pack_end (GTK_BOX (hbox), buttons, TRUE, TRUE, 0);
581 gtk_box_pack_end (GTK_BOX (hbox),
582 gtk_image_new_from_pixbuf (bell_picture),
585 gtk_container_add (GTK_CONTAINER (window), hbox);
586 gtk_widget_show_all (GTK_WIDGET (window));