21 |
#include <math.h> |
#include <math.h> |
22 |
#include <string.h> |
#include <string.h> |
23 |
|
|
24 |
|
#if MAEMO_VERSION_MAJOR == 5 |
25 |
|
#include <gdk/gdkx.h> |
26 |
|
#include <X11/Xatom.h> |
27 |
|
#endif |
28 |
|
|
29 |
static GtkWidget *cache_description(appdata_t *appdata, cache_t *cache) { |
static GtkWidget *cache_description(appdata_t *appdata, cache_t *cache) { |
30 |
return html_view(appdata, cache->long_description, |
return html_view(appdata, cache->long_description, |
31 |
cache->long_is_html?HTML_HTML:HTML_PLAIN_TEXT, TRUE, cache, NULL); |
cache->long_is_html?HTML_HTML:HTML_PLAIN_TEXT, TRUE, cache, NULL); |
190 |
vbox = gtk_vbox_new(FALSE, 4); |
vbox = gtk_vbox_new(FALSE, 4); |
191 |
|
|
192 |
/* hbox containing the four columns of cache details */ |
/* hbox containing the four columns of cache details */ |
193 |
|
GtkWidget *pbox = portrait_box_new(FALSE, 0); |
194 |
|
|
195 |
GtkWidget *ihbox = gtk_hbox_new(FALSE, 0); |
GtkWidget *ihbox = gtk_hbox_new(FALSE, 0); |
196 |
|
|
197 |
/* vbox containing leftmost column (icon and container) */ |
/* vbox containing leftmost column (icon and container) */ |
247 |
|
|
248 |
gtk_box_pack_start_defaults(GTK_BOX(ihbox), colbox); |
gtk_box_pack_start_defaults(GTK_BOX(ihbox), colbox); |
249 |
|
|
250 |
|
/* pack left two columns into portrait box */ |
251 |
|
gtk_box_pack_start_defaults(GTK_BOX(pbox), ihbox); |
252 |
|
ihbox = gtk_hbox_new(FALSE, 0); |
253 |
|
|
254 |
/* ----------- vbox containing all ratings ---------- */ |
/* ----------- vbox containing all ratings ---------- */ |
255 |
colbox = gtk_vbox_new(FALSE, 0); |
colbox = gtk_vbox_new(FALSE, 0); |
256 |
|
|
333 |
} |
} |
334 |
|
|
335 |
gtk_box_pack_start_defaults(GTK_BOX(ihbox), colbox); |
gtk_box_pack_start_defaults(GTK_BOX(ihbox), colbox); |
336 |
|
gtk_box_pack_start_defaults(GTK_BOX(pbox), ihbox); |
337 |
|
|
338 |
/* ----------------------------------------------------- */ |
/* ----------------------------------------------------- */ |
339 |
|
|
340 |
gtk_box_pack_start(GTK_BOX(vbox), ihbox, FALSE, FALSE, 0); |
gtk_box_pack_start(GTK_BOX(vbox), pbox, FALSE, FALSE, 0); |
341 |
gtk_box_pack_start(GTK_BOX(vbox), gtk_hseparator_new(), FALSE, FALSE, 0); |
gtk_box_pack_start(GTK_BOX(vbox), gtk_hseparator_new(), FALSE, FALSE, 0); |
342 |
|
|
343 |
/* ----------------------------------------------------- */ |
/* ----------------------------------------------------- */ |
344 |
|
|
345 |
|
if(cache->attribute) { |
346 |
|
GtkWidget *thbox = gtk_hbox_new(FALSE, 0); |
347 |
|
ihbox = gtk_hbox_new(FALSE, 0); |
348 |
|
|
349 |
|
attribute_t *att = cache->attribute; |
350 |
|
while(att) { |
351 |
|
if(att->inc) |
352 |
|
tip = icon_get_widget(ICON_ATT, att->id+1); |
353 |
|
else |
354 |
|
tip = icon_get_widget_ovl(ICON_ATT, att->id+1, 0); |
355 |
|
|
356 |
|
gtk_box_pack_start(GTK_BOX(ihbox), tip, FALSE, FALSE, 4); |
357 |
|
|
358 |
|
#ifndef USE_MAEMO |
359 |
|
gtk_tooltips_set_tip(tips, tip, _(att->name), NULL); |
360 |
|
#endif |
361 |
|
|
362 |
|
att = att->next; |
363 |
|
} |
364 |
|
|
365 |
|
gtk_box_pack_start(GTK_BOX(thbox), ihbox, TRUE, FALSE, 0); |
366 |
|
gtk_box_pack_start(GTK_BOX(vbox), thbox, FALSE, FALSE, 0); |
367 |
|
gtk_box_pack_start(GTK_BOX(vbox), gtk_hseparator_new(), FALSE, FALSE, 0); |
368 |
|
} |
369 |
|
|
370 |
|
/* ----------------------------------------------------- */ |
371 |
|
|
372 |
if(cache->short_description) |
if(cache->short_description) |
373 |
gtk_box_pack_start_defaults(GTK_BOX(vbox), |
gtk_box_pack_start_defaults(GTK_BOX(vbox), |
374 |
html_view(appdata, cache->short_description, |
html_view(appdata, cache->short_description, |
637 |
if(gc_link) { |
if(gc_link) { |
638 |
GtkWidget *but = |
GtkWidget *but = |
639 |
gtk_button_new_with_label(_("Post a new log entry for this geocache")); |
gtk_button_new_with_label(_("Post a new log entry for this geocache")); |
|
#if 0 |
|
|
gtk_button_set_image(GTK_BUTTON(but), |
|
|
gtk_image_new_from_stock(GTK_STOCK_ADD, GTK_ICON_SIZE_BUTTON)); |
|
|
gtk_button_set_image_position(GTK_BUTTON(but), GTK_POS_LEFT); |
|
|
#endif |
|
640 |
#if defined(USE_MAEMO) && (MAEMO_VERSION_MAJOR == 5) |
#if defined(USE_MAEMO) && (MAEMO_VERSION_MAJOR == 5) |
641 |
hildon_gtk_widget_set_theme_size(but, |
hildon_gtk_widget_set_theme_size(but, |
642 |
(HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH)); |
(HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH)); |
812 |
g_free(context); |
g_free(context); |
813 |
} |
} |
814 |
|
|
|
#if defined(USE_MAEMO) && (MAEMO_VERSION_MAJOR >= 5) |
|
|
#define CUSTOM_NOTEBOOK |
|
|
#endif |
|
|
|
|
|
static GtkWidget *notebook_new(void) { |
|
|
#ifdef CUSTOM_NOTEBOOK |
|
|
GtkWidget *vbox = gtk_vbox_new(FALSE, 0); |
|
|
|
|
|
GtkWidget *notebook = gtk_notebook_new(); |
|
|
|
|
|
/* prevents user from accidentially touching the breadcrumb trail */ |
|
|
/* (looks ugly on fremantle as it isn't themed) */ |
|
|
// gtk_notebook_set_tab_pos(GTK_NOTEBOOK(notebook), GTK_POS_BOTTOM); |
|
|
|
|
|
/* solution for fremantle: we use a row of ordinary buttons instead */ |
|
|
/* of regular tabs */ |
|
|
|
|
|
/* hide the regular tabs */ |
|
|
gtk_notebook_set_show_tabs(GTK_NOTEBOOK(notebook), FALSE); |
|
|
|
|
|
gtk_box_pack_start_defaults(GTK_BOX(vbox), notebook); |
|
|
|
|
|
/* store a reference to the notebook in the vbox */ |
|
|
g_object_set_data(G_OBJECT(vbox), "notebook", (gpointer)notebook); |
|
|
|
|
|
/* create a hbox for the buttons */ |
|
|
GtkWidget *hbox = gtk_hbox_new(TRUE, 0); |
|
|
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); |
|
|
g_object_set_data(G_OBJECT(vbox), "hbox", (gpointer)hbox); |
|
|
|
|
|
return vbox; |
|
|
#else |
|
|
return gtk_notebook_new(); |
|
|
#endif |
|
|
} |
|
|
|
|
|
#ifdef CUSTOM_NOTEBOOK |
|
|
static void on_notebook_button_clicked(GtkWidget *button, gpointer data) { |
|
|
GtkNotebook *nb = |
|
|
GTK_NOTEBOOK(g_object_get_data(G_OBJECT(data), "notebook")); |
|
|
|
|
|
gint page = (gint)g_object_get_data(G_OBJECT(button), "page"); |
|
|
gtk_notebook_set_current_page(nb, page); |
|
|
} |
|
|
#endif |
|
|
|
|
|
static void notebook_append_page(GtkWidget *notebook, |
|
|
GtkWidget *page, char *label) { |
|
|
#ifdef CUSTOM_NOTEBOOK |
|
|
GtkNotebook *nb = |
|
|
GTK_NOTEBOOK(g_object_get_data(G_OBJECT(notebook), "notebook")); |
|
|
|
|
|
gint page_num = gtk_notebook_append_page(nb, page, gtk_label_new(label)); |
|
|
GtkWidget *button = NULL; |
|
|
|
|
|
/* select button for page 0 by default */ |
|
|
if(!page_num) { |
|
|
button = gtk_radio_button_new_with_label(NULL, label); |
|
|
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); |
|
|
g_object_set_data(G_OBJECT(notebook), "group_master", (gpointer)button); |
|
|
} else { |
|
|
GtkWidget *master = g_object_get_data(G_OBJECT(notebook), "group_master"); |
|
|
button = gtk_radio_button_new_with_label_from_widget( |
|
|
GTK_RADIO_BUTTON(master), label); |
|
|
} |
|
|
|
|
|
gtk_toggle_button_set_mode(GTK_TOGGLE_BUTTON(button), FALSE); |
|
|
g_object_set_data(G_OBJECT(button), "page", (gpointer)page_num); |
|
|
|
|
|
gtk_signal_connect(GTK_OBJECT(button), "clicked", |
|
|
GTK_SIGNAL_FUNC(on_notebook_button_clicked), notebook); |
|
|
|
|
|
#if defined(USE_MAEMO) && (MAEMO_VERSION_MAJOR == 5) |
|
|
hildon_gtk_widget_set_theme_size(button, |
|
|
(HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH)); |
|
|
#endif |
|
|
|
|
|
gtk_box_pack_start_defaults( |
|
|
GTK_BOX(g_object_get_data(G_OBJECT(notebook), "hbox")), |
|
|
button); |
|
|
|
|
|
#else |
|
|
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page, gtk_label_new(label)); |
|
|
#endif |
|
|
} |
|
|
|
|
815 |
static GObject *notebook_object(GtkWidget *notebook) { |
static GObject *notebook_object(GtkWidget *notebook) { |
816 |
#ifdef CUSTOM_NOTEBOOK |
return G_OBJECT(notebook_get_gtk_notebook(notebook)); |
|
return G_OBJECT(g_object_get_data(G_OBJECT(notebook), "notebook")); |
|
|
#else |
|
|
return G_OBJECT(notebook); |
|
|
#endif |
|
817 |
} |
} |
818 |
|
|
819 |
GtkWidget *cache_view(appdata_t *appdata, cache_t *cache) { |
GtkWidget *cache_view(appdata_t *appdata, cache_t *cache) { |
845 |
notebook_append_page(notebook, |
notebook_append_page(notebook, |
846 |
cache_hint(appdata, cache), _("Hint")); |
cache_hint(appdata, cache), _("Hint")); |
847 |
|
|
848 |
if(cache->log) |
// always display log page to allow user to post a new log |
849 |
|
if(cache->log |
850 |
|
#ifdef ENABLE_BROWSER_INTERFACE |
851 |
|
|| (strncmp(cache->id, "GC", 2) == 0) |
852 |
|
#endif |
853 |
|
) |
854 |
notebook_append_page(notebook, |
notebook_append_page(notebook, |
855 |
cache_logs(appdata, cache_context, cache->log, cache->logs_are_html), |
cache_logs(appdata, cache_context, cache->log, cache->logs_are_html), |
856 |
_("Logs")); |
_("Logs")); |
863 |
notebook_append_page(notebook, |
notebook_append_page(notebook, |
864 |
cache_tbs(appdata, cache->tb), _("TBs")); |
cache_tbs(appdata, cache->tb), _("TBs")); |
865 |
|
|
866 |
notebook_append_page(notebook, |
/* the demo caches don't have coordinates, so avoid */ |
867 |
cache_notes(cache_context), _("Notes")); |
/* having to deal with them */ |
868 |
|
if(!isnan(cache->pos.lat) && !isnan(cache->pos.lon)) { |
869 |
|
notebook_append_page(notebook, |
870 |
|
cache_notes(cache_context), _("Notes")); |
871 |
|
|
872 |
notebook_append_page(notebook, |
notebook_append_page(notebook, |
873 |
goto_cache(cache_context), _("Goto")); |
goto_cache(cache_context), _("Goto")); |
874 |
|
} |
875 |
|
|
876 |
g_signal_connect(notebook_object(notebook), "switch-page", |
g_signal_connect(notebook_object(notebook), "switch-page", |
877 |
G_CALLBACK(on_notebook_page_change), cache_context); |
G_CALLBACK(on_notebook_page_change), cache_context); |
904 |
|
|
905 |
#else |
#else |
906 |
#ifdef USE_STACKABLE_WINDOW |
#ifdef USE_STACKABLE_WINDOW |
907 |
|
|
908 |
|
#if !defined(__i386__) |
909 |
|
/* get access to zoom buttons */ |
910 |
|
static void |
911 |
|
on_window_realize(GtkWidget *widget, gpointer data) { |
912 |
|
if (widget->window) { |
913 |
|
unsigned char value = 1; |
914 |
|
Atom hildon_zoom_key_atom = |
915 |
|
gdk_x11_get_xatom_by_name("_HILDON_ZOOM_KEY_ATOM"), |
916 |
|
integer_atom = gdk_x11_get_xatom_by_name("INTEGER"); |
917 |
|
Display *dpy = |
918 |
|
GDK_DISPLAY_XDISPLAY(gdk_drawable_get_display(widget->window)); |
919 |
|
Window w = GDK_WINDOW_XID(widget->window); |
920 |
|
|
921 |
|
XChangeProperty(dpy, w, hildon_zoom_key_atom, |
922 |
|
integer_atom, 8, PropModeReplace, &value, 1); |
923 |
|
} |
924 |
|
} |
925 |
|
#endif |
926 |
|
|
927 |
static void on_cache_destroy (GtkWidget *widget, appdata_t *appdata) { |
static void on_cache_destroy (GtkWidget *widget, appdata_t *appdata) { |
928 |
appdata->cur_cache = NULL; |
appdata->cur_cache = NULL; |
929 |
|
|
938 |
GtkWidget *window = hildon_stackable_window_new(); |
GtkWidget *window = hildon_stackable_window_new(); |
939 |
appdata->window = HILDON_WINDOW(window); |
appdata->window = HILDON_WINDOW(window); |
940 |
|
|
941 |
|
#if !defined(__i386__) |
942 |
|
g_signal_connect(G_OBJECT(appdata->window), "realize", |
943 |
|
G_CALLBACK(on_window_realize), NULL); |
944 |
|
#endif |
945 |
|
|
946 |
|
g_signal_connect(G_OBJECT(appdata->window), "key_press_event", |
947 |
|
G_CALLBACK(on_window_key_press), appdata); |
948 |
|
|
949 |
/* store last "cur_view" in window */ |
/* store last "cur_view" in window */ |
950 |
g_object_set_data(G_OBJECT(window), "cur_view", appdata->cur_view); |
g_object_set_data(G_OBJECT(window), "cur_view", appdata->cur_view); |
951 |
|
|
952 |
appdata->cur_cache = cache; |
appdata->cur_cache = cache; |
953 |
gtk_window_set_title(GTK_WINDOW(window), cache->name); |
gtk_window_set_title(GTK_WINDOW(window), cache->name); |
954 |
|
|
955 |
|
/* make sure window can control gps */ |
956 |
|
g_signal_connect(G_OBJECT(window), "focus-in-event", |
957 |
|
G_CALLBACK(on_main_focus_change), appdata); |
958 |
|
|
959 |
|
g_signal_connect(G_OBJECT(window), "focus-out-event", |
960 |
|
G_CALLBACK(on_main_focus_change), appdata); |
961 |
|
|
962 |
/* create cache visualization widget */ |
/* create cache visualization widget */ |
963 |
appdata->cur_view = cache_view(appdata, cache); |
appdata->cur_view = cache_view(appdata, cache); |
964 |
gtk_container_add(GTK_CONTAINER(window), appdata->cur_view); |
gtk_container_add(GTK_CONTAINER(window), appdata->cur_view); |