Diff of /trunk/src/misc.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 223 by harbaum, Tue Dec 1 20:03:51 2009 UTC revision 250 by harbaum, Sat Jan 23 20:12:41 2010 UTC
# Line 29  Line 29 
29    
30  #include "gpxview.h"  #include "gpxview.h"
31    
32    #ifdef ENABLE_OSM_GPS_MAP
33    #include "osm-gps-map.h"
34    #endif
35    
36  #if defined(USE_MAEMO) && (MAEMO_VERSION_MAJOR >= 5)  #if defined(USE_MAEMO) && (MAEMO_VERSION_MAJOR >= 5)
37  #include <hildon/hildon-entry.h>  #include <hildon/hildon-entry.h>
38  #include <hildon/hildon-touch-selector.h>  #include <hildon/hildon-touch-selector.h>
39  #include <hildon/hildon-picker-button.h>  #include <hildon/hildon-picker-button.h>
40  #include <hildon/hildon-picker-dialog.h>  #include <hildon/hildon-picker-dialog.h>
41    #include <hildon/hildon-check-button.h>
42  #endif  #endif
43    
44  float roundf(float x);  float roundf(float x);
# Line 46  float roundf(float x); Line 51  float roundf(float x);
51  #define COORDINATE_PICKER  #define COORDINATE_PICKER
52  #endif  #endif
53    
54    static const char *decimal_point(void) {
55      static const char *point = ".";
56    
57      struct lconv *lconv = localeconv();
58    
59      if(lconv && lconv->decimal_point)
60        return lconv->decimal_point;
61    
62      return point;
63    }
64    
65  char strlastchr(char *str) {  char strlastchr(char *str) {
66    return str[strlen(str)]-1;    return str[strlen(str)]-1;
67  }  }
# Line 321  static gboolean mark(GtkWidget *widget, Line 337  static gboolean mark(GtkWidget *widget,
337    return valid;    return valid;
338  }  }
339    
340  GtkWidget *red_entry_new(void) {  GtkWidget *red_entry_new_with_text(char *str) {
341    GdkColor color;    GdkColor color;
342    
343    GtkWidget *widget = entry_new();    GtkWidget *widget = entry_new();
344    gdk_color_parse("#ff0000", &color);    gdk_color_parse("#ff0000", &color);
345    gtk_widget_modify_text(widget, TAG_STATE, &color);    gtk_widget_modify_text(widget, TAG_STATE, &color);
346      if(str) gtk_entry_set_text(GTK_ENTRY(widget), str);
347    
348    return widget;    return widget;
349  }  }
350    
# Line 561  static gint on_lat_picker_button_press(G Line 579  static gint on_lat_picker_button_press(G
579                  minw[0] = digit_picker_create(0,5, min/10));                  minw[0] = digit_picker_create(0,5, min/10));
580      gtk_box_pack_start_defaults(GTK_BOX(hbox),      gtk_box_pack_start_defaults(GTK_BOX(hbox),
581                  minw[1] = digit_picker_create(0,9, min%10));                  minw[1] = digit_picker_create(0,9, min%10));
582      gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new("."), FALSE, FALSE, 0);      gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new(decimal_point()),
583                           FALSE, FALSE, 0);
584    
585      gtk_box_pack_start_defaults(GTK_BOX(hbox),      gtk_box_pack_start_defaults(GTK_BOX(hbox),
586                  minfracw[0] = digit_picker_create(0,9, minfrac/100));                  minfracw[0] = digit_picker_create(0,9, minfrac/100));
# Line 605  static gint on_lat_picker_button_press(G Line 624  static gint on_lat_picker_button_press(G
624  }  }
625  #endif  #endif
626    
627    /* whatever there is in the entry: if it's illegal make it */
628    #define ILLEGAL_LAT  "X --° --%s---'"
629    #define ILLEGAL_LON  "X ---° --%s---'"
630    
631    static void pos_lat_check(GtkWidget *widget) {
632      if(isnan(lat_entry_get(widget))) {
633        char *str = g_strdup_printf(ILLEGAL_LAT, decimal_point());
634    
635    #ifndef COORDINATE_PICKER
636        mark(widget, FALSE);
637        gtk_entry_set_text(GTK_ENTRY(widget), str);
638    #else
639        gtk_button_set_label(GTK_BUTTON(widget), str);
640    #endif
641    
642        g_free(str);
643      }
644    }
645    
646    static void pos_lon_check(GtkWidget *widget) {
647      if(isnan(lon_entry_get(widget))) {
648        char *str = g_strdup_printf(ILLEGAL_LON, decimal_point());
649    
650    #ifndef COORDINATE_PICKER
651        mark(widget, FALSE);
652        gtk_entry_set_text(GTK_ENTRY(widget), str);
653    #else
654        gtk_button_set_label(GTK_BUTTON(widget), str);
655    #endif
656    
657        g_free(str);
658      }
659    }
660    
661  /* a entry that is colored red when being "active" */  /* a entry that is colored red when being "active" */
662  GtkWidget *lat_entry_new(float lat) {  GtkWidget *lat_entry_new(float lat) {
663    char str[32];    char str[32];
664    pos_lat_str(str, sizeof(str), lat);    pos_lat_str(str, sizeof(str), lat);
665    
666  #ifndef COORDINATE_PICKER  #ifndef COORDINATE_PICKER
667    GdkColor color;    GtkWidget *widget = red_entry_new_with_text(str);
   
   GtkWidget *widget = entry_new();  
   gdk_color_parse("#ff0000", &color);  
   gtk_widget_modify_text(widget, TAG_STATE, &color);  
   
   gtk_entry_set_text(GTK_ENTRY(widget), str);  
668    
669    g_signal_connect(G_OBJECT(widget), "changed",    g_signal_connect(G_OBJECT(widget), "changed",
670                     G_CALLBACK(callback_modified_lat), NULL);                     G_CALLBACK(callback_modified_lat), NULL);
# Line 635  GtkWidget *lat_entry_new(float lat) { Line 682  GtkWidget *lat_entry_new(float lat) {
682                       (GtkSignalFunc)on_lat_picker_button_press, NULL);                       (GtkSignalFunc)on_lat_picker_button_press, NULL);
683  #endif  #endif
684    
685      pos_lat_check(widget);
686    return widget;    return widget;
687  }  }
688    
# Line 687  static gint on_lon_picker_button_press(G Line 735  static gint on_lon_picker_button_press(G
735                  minw[0] = digit_picker_create(0,5, min/10));                  minw[0] = digit_picker_create(0,5, min/10));
736      gtk_box_pack_start_defaults(GTK_BOX(hbox),      gtk_box_pack_start_defaults(GTK_BOX(hbox),
737                  minw[1] = digit_picker_create(0,9, min%10));                  minw[1] = digit_picker_create(0,9, min%10));
738      gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new("."), FALSE, FALSE, 0);      gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new(decimal_point()),
739                           FALSE, FALSE, 0);
740    
741      gtk_box_pack_start_defaults(GTK_BOX(hbox),      gtk_box_pack_start_defaults(GTK_BOX(hbox),
742                  minfracw[0] = digit_picker_create(0,9, minfrac/100));                  minfracw[0] = digit_picker_create(0,9, minfrac/100));
# Line 736  GtkWidget *lon_entry_new(float lon) { Line 785  GtkWidget *lon_entry_new(float lon) {
785    pos_lon_str(str, sizeof(str), lon);    pos_lon_str(str, sizeof(str), lon);
786    
787  #ifndef COORDINATE_PICKER  #ifndef COORDINATE_PICKER
788    GdkColor color;    GtkWidget *widget = red_entry_new_with_text(str);
   
   GtkWidget *widget = entry_new();  
   gdk_color_parse("#ff0000", &color);  
   gtk_widget_modify_text(widget, TAG_STATE, &color);  
   
   gtk_entry_set_text(GTK_ENTRY(widget), str);  
   
789    g_signal_connect(G_OBJECT(widget), "changed",    g_signal_connect(G_OBJECT(widget), "changed",
790                     G_CALLBACK(callback_modified_lon), NULL);                     G_CALLBACK(callback_modified_lon), NULL);
791    
# Line 760  GtkWidget *lon_entry_new(float lon) { Line 802  GtkWidget *lon_entry_new(float lon) {
802                       (GtkSignalFunc)on_lon_picker_button_press, NULL);                       (GtkSignalFunc)on_lon_picker_button_press, NULL);
803  #endif  #endif
804    
805      pos_lon_check(widget);
806    return widget;    return widget;
807  }  }
808    
# Line 792  void lat_entry_set(GtkWidget *widget, fl Line 835  void lat_entry_set(GtkWidget *widget, fl
835    g_object_set_data(G_OBJECT(widget), "latitude", (gpointer)lat_int);    g_object_set_data(G_OBJECT(widget), "latitude", (gpointer)lat_int);
836    g_signal_emit_by_name(widget, "changed");    g_signal_emit_by_name(widget, "changed");
837  #endif  #endif
838      pos_lat_check(widget);
839  }  }
840    
841  void lon_entry_set(GtkWidget *widget, float lon) {  void lon_entry_set(GtkWidget *widget, float lon) {
# Line 805  void lon_entry_set(GtkWidget *widget, fl Line 849  void lon_entry_set(GtkWidget *widget, fl
849    g_object_set_data(G_OBJECT(widget), "longitude", (gpointer)lon_int);    g_object_set_data(G_OBJECT(widget), "longitude", (gpointer)lon_int);
850    g_signal_emit_by_name(widget, "changed");    g_signal_emit_by_name(widget, "changed");
851  #endif  #endif
852      pos_lon_check(widget);
853  }  }
854    
855  void lat_label_set(GtkWidget *widget, float lat) {  void lat_label_set(GtkWidget *widget, float lat) {
# Line 941  GtkWidget *dist_entry_new(float dist, gb Line 986  GtkWidget *dist_entry_new(float dist, gb
986    distance_str(str, sizeof(str), dist, mil);    distance_str(str, sizeof(str), dist, mil);
987    
988  #ifndef COORDINATE_PICKER  #ifndef COORDINATE_PICKER
989    GdkColor color;    GtkWidget *widget = red_entry_new_with_text(str);
   GtkWidget *widget = entry_new();  
   gdk_color_parse("#ff0000", &color);  
   gtk_widget_modify_text(widget, TAG_STATE, &color);  
   
   gtk_entry_set_text(GTK_ENTRY(widget), str);  
   
990    g_signal_connect(G_OBJECT(widget), "changed",    g_signal_connect(G_OBJECT(widget), "changed",
991                     G_CALLBACK(callback_modified_dist), NULL);                     G_CALLBACK(callback_modified_dist), NULL);
992    
# Line 986  void dist_entry_set(GtkWidget *widget, f Line 1025  void dist_entry_set(GtkWidget *widget, f
1025  #ifndef COORDINATE_PICKER  #ifndef COORDINATE_PICKER
1026    gtk_entry_set_text(GTK_ENTRY(widget), str);    gtk_entry_set_text(GTK_ENTRY(widget), str);
1027  #else  #else
1028      gtk_button_set_label(GTK_BUTTON(widget), str);
1029    int dist_int = (int)roundf(dist * 1000);        // km -> m    int dist_int = (int)roundf(dist * 1000);        // km -> m
1030    if(mil) dist_int = (int)roundf(dist * 5280.0);  // mi -> ft    if(mil) dist_int = (int)roundf(dist * 5280.0);  // mi -> ft
1031    g_object_set_data(G_OBJECT(widget), "distance", (gpointer)dist_int);    g_object_set_data(G_OBJECT(widget), "distance", (gpointer)dist_int);
1032    g_object_set_data(G_OBJECT(widget), "mil", (gpointer)mil);    g_object_set_data(G_OBJECT(widget), "mil", (gpointer)mil);
1033    gtk_button_set_label(GTK_BUTTON(widget), str);    g_signal_emit_by_name(widget, "changed");
1034  #endif  #endif
1035  }  }
1036    
# Line 1185  static void cb_map(GtkWidget *item, gpoi Line 1225  static void cb_map(GtkWidget *item, gpoi
1225  }  }
1226  #endif  #endif
1227    
1228    #ifdef ENABLE_MAEMO_MAPPER
1229    static void cb_mm(GtkWidget *item, gpointer data) {
1230      appdata_t *appdata = (appdata_t*)data;
1231    
1232      pos_set(item, appdata->mmpos.lat, appdata->mmpos.lon);
1233    }
1234    #endif
1235    
1236  static void cb_cache(GtkWidget *item, gpointer data) {  static void cb_cache(GtkWidget *item, gpointer data) {
1237    appdata_t *appdata = (appdata_t*)data;    appdata_t *appdata = (appdata_t*)data;
1238    
# Line 1195  static void cb_cache(GtkWidget *item, gp Line 1243  static void cb_cache(GtkWidget *item, gp
1243    
1244    if(!id)    if(!id)
1245      pos_set(item, cache->pos.lat, cache->pos.lon);      pos_set(item, cache->pos.lat, cache->pos.lon);
1246    else if(id == 1)    else if(id == 1) {
1247      pos_set(item, cache->notes->pos.lat, cache->notes->pos.lon);      /* fetch position out of notes dialog since they probably */
1248    else {      /* haven't been saved yet */
1249        pos_t pos = notes_get_pos(appdata->cache_context);
1250        pos_set(item, pos.lat, pos.lon);
1251      } else {
1252      wpt_t *wpt = cache->wpt;      wpt_t *wpt = cache->wpt;
1253      while(wpt && id > 2) {      while(wpt && id > 2) {
1254        wpt = wpt->next;        wpt = wpt->next;
# Line 1249  static GtkWidget *popup_menu_create(appd Line 1300  static GtkWidget *popup_menu_create(appd
1300    gint id = 2;    gint id = 2;
1301    while(location) {    while(location) {
1302      if(pos_valid(&location->pos))      if(pos_valid(&location->pos))
1303        menu_add(menu, appdata, icon_get_widget(ICON_POS, 21),        menu_add(menu, appdata, icon_get_widget(ICON_POS, 17),
1304                 location->name, cb_gps, id, lon_entry, lat_entry);                 location->name, cb_gps, id, lon_entry, lat_entry);
1305    
1306      id++;      id++;
# Line 1266  static GtkWidget *popup_menu_create(appd Line 1317  static GtkWidget *popup_menu_create(appd
1317               cb_map, 0, lon_entry, lat_entry);               cb_map, 0, lon_entry, lat_entry);
1318  #endif  #endif
1319    
1320    #ifdef ENABLE_MAEMO_MAPPER
1321      if(appdata->mmpos_valid) {
1322        menu_add(menu, appdata, icon_get_widget(ICON_POS, 24),
1323                 _("Maemo Mapper position"), cb_mm, 0, lon_entry, lat_entry);
1324      }
1325    #endif
1326    
1327    if(appdata->cur_cache) {    if(appdata->cur_cache) {
1328      cache_t *cache = appdata->cur_cache;      cache_t *cache = appdata->cur_cache;
1329    
# Line 1278  static GtkWidget *popup_menu_create(appd Line 1336  static GtkWidget *popup_menu_create(appd
1336                 name, cb_cache, 0, lon_entry, lat_entry);                 name, cb_cache, 0, lon_entry, lat_entry);
1337    
1338      /* overwritten cache position */      /* overwritten cache position */
1339      if(cache->notes && pos_valid(&cache->notes->pos))      if(appdata->cache_context && notes_get_override(appdata->cache_context))
1340        menu_add(menu, appdata, icon_get_widget(ICON_POS, cache->type + 6),        menu_add(menu, appdata, icon_get_widget(ICON_POS, cache->type + 6),
1341                 _("Modified coordinate"), cb_cache, 1, lon_entry, lat_entry);                 _("Modified coordinate"), cb_cache, 1, lon_entry, lat_entry);
1342    
# Line 1433  static GtkWidget *preset_picker_create(a Line 1491  static GtkWidget *preset_picker_create(a
1491    gint id = 2;    gint id = 2;
1492    while(location) {    while(location) {
1493      if(pos_valid(&location->pos))      if(pos_valid(&location->pos))
1494        preset_picker_add(store, appdata, icon_get(ICON_POS, 21),        preset_picker_add(store, appdata, icon_get(ICON_POS, 17),
1495                          location->name, cb_gps, id);                          location->name, cb_gps, id);
1496    
1497      id++;      id++;
# Line 1443  static GtkWidget *preset_picker_create(a Line 1501  static GtkWidget *preset_picker_create(a
1501    if(pos_valid(&appdata->geomath))    if(pos_valid(&appdata->geomath))
1502      preset_picker_add(store, appdata, icon_get(ICON_POS, 19),      preset_picker_add(store, appdata, icon_get(ICON_POS, 19),
1503                        _("Geomath projection"), cb_geomath, 0);                        _("Geomath projection"), cb_geomath, 0);
1504    
1505  #ifdef ENABLE_OSM_GPS_MAP  #ifdef ENABLE_OSM_GPS_MAP
1506    if(pos_valid(&appdata->map.pos))    if(pos_valid(&appdata->map.pos))
1507      preset_picker_add(store, appdata, icon_get(ICON_POS, 20),      preset_picker_add(store, appdata, icon_get(ICON_POS, 20),
1508                        _("Map position"), cb_map, 0);                        _("Map position"), cb_map, 0);
1509  #endif  #endif
1510    
1511    #ifdef ENABLE_MAEMO_MAPPER
1512      if(appdata->mmpos_valid) {
1513        preset_picker_add(store, appdata, icon_get(ICON_POS, 24),
1514                          _("Maemo Mapper position"), cb_mm, 0);
1515      }
1516    #endif
1517    
1518    if(appdata->cur_cache) {    if(appdata->cur_cache) {
1519      cache_t *cache = appdata->cur_cache;      cache_t *cache = appdata->cur_cache;
1520    
# Line 1461  static GtkWidget *preset_picker_create(a Line 1527  static GtkWidget *preset_picker_create(a
1527                          name, cb_cache, 0);                          name, cb_cache, 0);
1528    
1529      /* overwritten cache position */      /* overwritten cache position */
1530      if(cache->notes && pos_valid(&cache->notes->pos))      if(appdata->cache_context && notes_get_override(appdata->cache_context))
1531        preset_picker_add(store, appdata, icon_get(ICON_POS, cache->type + 6),        preset_picker_add(store, appdata, icon_get(ICON_POS, cache->type + 6),
1532                          _("Modified coordinate"), cb_cache, 1);                          _("Modified coordinate"), cb_cache, 1);
1533    
# Line 1514  static gint on_preset_picker_button_pres Line 1580  static gint on_preset_picker_button_pres
1580    
1581    if(event->type == GDK_BUTTON_PRESS) {    if(event->type == GDK_BUTTON_PRESS) {
1582      GtkWidget *dialog =      GtkWidget *dialog =
1583        gtk_dialog_new_with_buttons(_("Preset coordinates"),        gtk_dialog_new_with_buttons(_("Use coordinate"),
1584            GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(button))),            GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(button))),
1585                                    GTK_DIALOG_MODAL,                                    GTK_DIALOG_MODAL,
1586            GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,            GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
# Line 1541  GtkWidget *preset_coordinate_picker(appd Line 1607  GtkWidget *preset_coordinate_picker(appd
1607    
1608    GtkWidget *button = gtk_button_new();    GtkWidget *button = gtk_button_new();
1609    
1610    gtk_button_set_image(GTK_BUTTON(button), icon_get_widget(ICON_POS, 17));    gtk_button_set_image(GTK_BUTTON(button), icon_get_widget(ICON_POS, 22));
1611    
1612    gtk_widget_set_tooltip_text(button, _("Preset coordinates"));  #ifndef USE_MAEMO
1613      gtk_widget_set_tooltip_text(button, _("Use coordinate"));
1614    #endif
1615    
1616    g_object_set_data(G_OBJECT(button), "lat_entry", (gpointer)lat_entry);    g_object_set_data(G_OBJECT(button), "lat_entry", (gpointer)lat_entry);
1617    g_object_set_data(G_OBJECT(button), "lon_entry", (gpointer)lon_entry);    g_object_set_data(G_OBJECT(button), "lon_entry", (gpointer)lon_entry);
# Line 1554  GtkWidget *preset_coordinate_picker(appd Line 1622  GtkWidget *preset_coordinate_picker(appd
1622    
1623    gtk_signal_connect(GTK_OBJECT(button), "destroy",    gtk_signal_connect(GTK_OBJECT(button), "destroy",
1624                       (GtkSignalFunc)on_popup_destroy, appdata);                       (GtkSignalFunc)on_popup_destroy, appdata);
   
   g_object_set_data(G_OBJECT(button), "menu",  
                     popup_menu_create(appdata, lat_entry, lon_entry));  
1625  #else  #else
1626  #ifdef FREMANTLE  #ifdef FREMANTLE
1627    hildon_gtk_widget_set_theme_size(button,    hildon_gtk_widget_set_theme_size(button,
# Line 1570  GtkWidget *preset_coordinate_picker(appd Line 1635  GtkWidget *preset_coordinate_picker(appd
1635    return button;    return button;
1636  }  }
1637    
1638    static pos_t goto_pos_get(GtkWidget *item) {
1639      pos_t pos;
1640    
1641      GtkWidget *lat_entry = g_object_get_data(G_OBJECT(item), "lat_entry");
1642      pos.lat = lat_entry_get(lat_entry);
1643    
1644      GtkWidget *lon_entry = g_object_get_data(G_OBJECT(item), "lon_entry");
1645      pos.lon = lon_entry_get(lon_entry);
1646    
1647      return  pos;
1648    }
1649    
1650    #ifdef ENABLE_MAEMO_MAPPER
1651    static void cb_mm_set(GtkWidget *item, gpointer data) {
1652      appdata_t *appdata = (appdata_t*)data;
1653    
1654      pos_t pos = goto_pos_get(item);
1655      if(!isnan(pos.lat) && !isnan(pos.lon))
1656        dbus_mm_set_position(appdata, &pos);
1657    }
1658    #endif
1659    
1660    #ifdef ENABLE_OSM_GPS_MAP
1661    static void cb_map_set(GtkWidget *item, gpointer data) {
1662      appdata_t *appdata = (appdata_t*)data;
1663    
1664      pos_t pos = goto_pos_get(item);
1665      if(!isnan(pos.lat) && !isnan(pos.lon)) {
1666        map(appdata);
1667        osm_gps_map_set_center(OSM_GPS_MAP(appdata->map.context->widget),
1668                                 pos.lat, pos.lon);
1669      }
1670    }
1671    #endif
1672    
1673    static void cb_clipboard_set(GtkWidget *item, gpointer data) {
1674      appdata_t *appdata = (appdata_t*)data;
1675    
1676      pos_t pos = goto_pos_get(item);
1677      if(!isnan(pos.lat) && !isnan(pos.lon)) {
1678        char lat[32], lon[32];
1679        pos_lat_str(lat, sizeof(lat), pos.lat);
1680        pos_lon_str(lon, sizeof(lon), pos.lon);
1681    
1682        char *str = g_strdup_printf("%s %s", lat, lon);
1683        gtk_clipboard_set_text(appdata->clipboard, str, -1);
1684        g_free(str);
1685      }
1686    }
1687    
1688    #ifndef PRESET_PICKER_DIALOG
1689    static GtkWidget *goto_popup_menu_create(appdata_t *appdata,
1690                        GtkWidget *lat_entry, GtkWidget *lon_entry) {
1691      GtkWidget *menu = gtk_menu_new();
1692    
1693    #if defined(ENABLE_OSM_GPS_MAP)
1694      menu_add(menu, appdata, icon_get_widget(ICON_POS, 20),
1695               _("Internal map"), cb_map_set, 0, lon_entry, lat_entry);
1696    #endif
1697    
1698    #if defined(ENABLE_MAEMO_MAPPER)
1699      menu_add(menu, appdata, icon_get_widget(ICON_POS, 24),
1700               _("Maemo Mapper"), cb_mm_set, 0, lon_entry, lat_entry);
1701    #endif
1702    
1703      menu_add(menu, appdata, icon_get_widget(ICON_POS, 25),
1704               _("Clipboard"), cb_clipboard_set, 0, lon_entry, lat_entry);
1705    
1706      gtk_widget_show_all(menu);
1707    
1708      return menu;
1709    }
1710    #else
1711    static GtkWidget *goto_picker_create(appdata_t *appdata,
1712                         GtkWidget *lat_entry, GtkWidget *lon_entry) {
1713      GtkCellRenderer *renderer;
1714      GtkListStore    *store;
1715    
1716      GtkWidget *view = gtk_tree_view_new();
1717    
1718      g_object_set_data(G_OBJECT(view), "lat_entry", (gpointer)lat_entry);
1719      g_object_set_data(G_OBJECT(view), "lon_entry", (gpointer)lon_entry);
1720    
1721      /* --- "Icon" column --- */
1722      renderer = gtk_cell_renderer_pixbuf_new();
1723      gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view),
1724          -1, "Icon", renderer, "pixbuf", PRESET_PICKER_COL_ICON, NULL);
1725    
1726      /* --- "Name" column --- */
1727      renderer = gtk_cell_renderer_text_new();
1728      g_object_set(renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL );
1729      GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes(
1730                     "Name", renderer, "text", PRESET_PICKER_COL_NAME, NULL);
1731      gtk_tree_view_column_set_expand(column, TRUE);
1732      gtk_tree_view_insert_column(GTK_TREE_VIEW(view), column, -1);
1733    
1734      store = gtk_list_store_new(PRESET_PICKER_NUM_COLS,
1735                                 GDK_TYPE_PIXBUF,
1736                                 G_TYPE_STRING,
1737                                 G_TYPE_INT,
1738                                 G_TYPE_POINTER);
1739    
1740    #if defined(ENABLE_OSM_GPS_MAP)
1741      preset_picker_add(store, appdata, icon_get(ICON_POS, 20),
1742                        _("Internal map"), cb_map_set, 0);
1743    #endif
1744    
1745    #if defined(ENABLE_MAEMO_MAPPER)
1746      preset_picker_add(store, appdata, icon_get(ICON_POS, 24),
1747                        _("Maemo Mapper"), cb_mm_set, 0);
1748    #endif
1749    
1750      preset_picker_add(store, appdata, icon_get(ICON_POS, 25),
1751                        _("Clipboard"), cb_clipboard_set, 0);
1752    
1753      gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(store));
1754      g_object_unref(store);
1755    
1756      /* make list react on clicks */
1757      g_signal_connect(view, "row-activated",
1758                       (GCallback)on_preset_picker_activated, appdata);
1759    
1760      /* put this inside a scrolled view */
1761    #ifndef USE_PANNABLE_AREA
1762      GtkWidget *scrolled_window = gtk_scrolled_window_new (NULL, NULL);
1763      gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
1764                                     GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
1765      gtk_container_add(GTK_CONTAINER(scrolled_window), view);
1766      return scrolled_window;
1767    #else
1768      GtkWidget *pannable_area = hildon_pannable_area_new();
1769      gtk_container_add(GTK_CONTAINER(pannable_area), view);
1770      return pannable_area;
1771    #endif
1772    }
1773    #endif
1774    
1775    static gint on_goto_button_press(GtkWidget *button,
1776                                     GdkEventButton *event, gpointer data) {
1777      appdata_t *appdata = (appdata_t*)data;
1778    
1779      if(event->type == GDK_BUTTON_PRESS) {
1780    
1781        gpointer lat_entry = g_object_get_data(G_OBJECT(button), "lat_entry");
1782        g_assert(lat_entry);
1783        gpointer lon_entry = g_object_get_data(G_OBJECT(button), "lon_entry");
1784        g_assert(lon_entry);
1785    
1786    #ifndef PRESET_PICKER_DIALOG
1787        GtkWidget *menu = g_object_get_data(G_OBJECT(button), "menu");
1788        if(!menu) {
1789          menu = goto_popup_menu_create(appdata, lat_entry, lon_entry);
1790          g_object_set_data(G_OBJECT(button), "menu", (gpointer)menu);
1791        }
1792    
1793        /* draw a popup menu */
1794        gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL,
1795                       event->button, event->time);
1796    #else
1797        GtkWidget *dialog =
1798          gtk_dialog_new_with_buttons(_("Show coordinate on map"),
1799              GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(button))),
1800                                      GTK_DIALOG_MODAL,
1801              GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
1802              NULL);
1803    
1804        gtk_window_set_default_size(GTK_WINDOW(dialog), 400, 210);
1805    
1806        gtk_box_pack_start_defaults(GTK_BOX(GTK_DIALOG(dialog)->vbox),
1807                            goto_picker_create(appdata, lat_entry, lon_entry));
1808    
1809        gtk_widget_show_all(dialog);
1810        gtk_dialog_run(GTK_DIALOG(dialog));
1811        gtk_widget_destroy(dialog);
1812    #endif
1813    
1814        return TRUE;
1815      }
1816      return FALSE;
1817    }
1818    
1819    /* a button which makes the map/maemo mapper go to the associated */
1820    /* position */
1821    GtkWidget *goto_coordinate(appdata_t *appdata,
1822                         GtkWidget *lat_entry, GtkWidget *lon_entry) {
1823    
1824      GtkWidget *button = gtk_button_new();
1825    
1826      gtk_button_set_image(GTK_BUTTON(button), icon_get_widget(ICON_POS, 23));
1827    
1828    #ifndef USE_MAEMO
1829      gtk_widget_set_tooltip_text(button, _("Show coordinate on map"));
1830    #endif
1831    
1832      g_object_set_data(G_OBJECT(button), "lat_entry", (gpointer)lat_entry);
1833      g_object_set_data(G_OBJECT(button), "lon_entry", (gpointer)lon_entry);
1834    
1835      gtk_signal_connect(GTK_OBJECT(button), "button-press-event",
1836                         (GtkSignalFunc)on_goto_button_press, appdata);
1837    
1838    #ifndef PRESET_PICKER_DIALOG
1839      gtk_signal_connect(GTK_OBJECT(button), "destroy",
1840                         (GtkSignalFunc)on_popup_destroy, appdata);
1841    #else
1842    #ifdef FREMANTLE
1843      hildon_gtk_widget_set_theme_size(button,
1844            (HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH));
1845    #endif
1846    #endif
1847    
1848      return button;
1849    }
1850    
1851  GtkWidget *entry_new(void) {  GtkWidget *entry_new(void) {
1852  #if !defined(USE_MAEMO) || (MAEMO_VERSION_MAJOR < 5)  #if !defined(USE_MAEMO) || (MAEMO_VERSION_MAJOR < 5)
1853    return gtk_entry_new();    return gtk_entry_new();
# Line 1674  GtkWidget *angle_entry_new(float angle) Line 1952  GtkWidget *angle_entry_new(float angle)
1952    angle_str(str, sizeof(str), angle);    angle_str(str, sizeof(str), angle);
1953    
1954  #ifndef COORDINATE_PICKER  #ifndef COORDINATE_PICKER
1955    GtkWidget *widget = red_entry_new();    GtkWidget *widget = red_entry_new_with_text(str);
   gtk_entry_set_text(GTK_ENTRY(widget), str);  
   
1956    g_signal_connect(G_OBJECT(widget), "changed",    g_signal_connect(G_OBJECT(widget), "changed",
1957                     G_CALLBACK(callback_modified_angle), NULL);                     G_CALLBACK(callback_modified_angle), NULL);
1958  #else  #else
# Line 1693  GtkWidget *angle_entry_new(float angle) Line 1969  GtkWidget *angle_entry_new(float angle)
1969  #endif  #endif
1970    return widget;    return widget;
1971  }  }
1972    
1973  float angle_entry_get(GtkWidget *widget) {  float angle_entry_get(GtkWidget *widget) {
1974  #ifndef COORDINATE_PICKER  #ifndef COORDINATE_PICKER
1975    char *p = (char*)gtk_entry_get_text(GTK_ENTRY(widget));    char *p = (char*)gtk_entry_get_text(GTK_ENTRY(widget));
# Line 1715  void angle_entry_set(GtkWidget *widget, Line 1991  void angle_entry_set(GtkWidget *widget,
1991    g_signal_emit_by_name(widget, "changed");    g_signal_emit_by_name(widget, "changed");
1992  #endif  #endif
1993  }  }
1994    
1995    GtkWidget *toggle_button_new_with_label(char *label) {
1996    #if !defined(USE_MAEMO) || (MAEMO_VERSION_MAJOR < 5)
1997      return gtk_check_button_new_with_label(label);
1998    #else
1999      GtkWidget *cbut = gtk_toggle_button_new_with_label(label);
2000      hildon_gtk_widget_set_theme_size(cbut,
2001               (HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH));
2002      gtk_toggle_button_set_mode(GTK_TOGGLE_BUTTON(cbut), FALSE);
2003      return cbut;
2004    #endif
2005    }
2006    
2007    void toggle_button_set_active(GtkWidget *button, gboolean active) {
2008      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), active);
2009    }
2010    
2011    gboolean toggle_button_get_active(GtkWidget *button) {
2012      return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button));
2013    }
2014    
2015    GtkWidget *check_button_new_with_label(char *label) {
2016    #if !defined(USE_MAEMO) || (MAEMO_VERSION_MAJOR < 5)
2017      return gtk_check_button_new_with_label(label);
2018    #else
2019      GtkWidget *cbut =
2020        hildon_check_button_new(HILDON_SIZE_FINGER_HEIGHT |
2021                                HILDON_SIZE_AUTO_WIDTH);
2022      gtk_button_set_label(GTK_BUTTON(cbut), label);
2023      return cbut;
2024    #endif
2025    }
2026    
2027    void check_button_set_active(GtkWidget *button, gboolean active) {
2028    #if !defined(USE_MAEMO) || (MAEMO_VERSION_MAJOR < 5)
2029      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), active);
2030    #else
2031      hildon_check_button_set_active(HILDON_CHECK_BUTTON(button), active);
2032    #endif
2033    }
2034    
2035    gboolean check_button_get_active(GtkWidget *button) {
2036    #if !defined(USE_MAEMO) || (MAEMO_VERSION_MAJOR < 5)
2037      return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button));
2038    #else
2039      return hildon_check_button_get_active(HILDON_CHECK_BUTTON(button));
2040    #endif
2041    }
2042    
2043    GtkWidget *button_new(void) {
2044      GtkWidget *button = gtk_button_new();
2045    #if defined(USE_MAEMO) && (MAEMO_VERSION_MAJOR == 5)
2046      hildon_gtk_widget_set_theme_size(button,
2047               (HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH));
2048    #endif
2049      return button;
2050    }
2051    
2052    GtkWidget *button_new_with_label(char *label) {
2053      GtkWidget *button = gtk_button_new_with_label(label);
2054    #if defined(USE_MAEMO) && (MAEMO_VERSION_MAJOR == 5)
2055      hildon_gtk_widget_set_theme_size(button,
2056               (HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH));
2057    #endif
2058      return button;
2059    }
2060    
2061    static void on_browse(GtkWidget *widget, gpointer data) {
2062      GtkWidget *dialog;
2063    
2064      char **fileptr = g_object_get_data(G_OBJECT(widget), "fileptr");
2065    
2066    #ifdef USE_MAEMO
2067      dialog = hildon_file_chooser_dialog_new(
2068                   GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(widget))),
2069                   GTK_FILE_CHOOSER_ACTION_SAVE);
2070    #else
2071      dialog = gtk_file_chooser_dialog_new(
2072                   g_object_get_data(G_OBJECT(widget), "sel_title"),
2073                   GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(widget))),
2074                   GTK_FILE_CHOOSER_ACTION_SAVE,
2075                   GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
2076                   GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
2077                   NULL);
2078    #endif
2079    
2080      if(*fileptr) {
2081        printf("set filename <%s>\n", *fileptr);
2082    
2083        if(!g_file_test(*fileptr, G_FILE_TEST_EXISTS)) {
2084          char *last_sep = strrchr(*fileptr, '/');
2085          if(last_sep) {
2086            *last_sep = 0;  // seperate path from file
2087    
2088            /* the user just created a new document */
2089            gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog),
2090                                                *fileptr);
2091            gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog),
2092                                              last_sep+1);
2093    
2094            /* restore full filename */
2095            *last_sep = '/';
2096          }
2097        } else
2098          gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), *fileptr);
2099      }
2100    
2101      if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_FM_OK) {
2102        gchar *name = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
2103        if(name) {
2104          if(*fileptr) g_free(*fileptr);
2105          *fileptr = g_strdup(name);
2106    
2107    #ifndef FREMANTLE
2108          GtkWidget *label = g_object_get_data(G_OBJECT(widget), "label");
2109          gtk_label_set_text(GTK_LABEL(label), *fileptr);
2110    #else
2111          hildon_button_set_value(HILDON_BUTTON(widget), *fileptr);
2112    #endif
2113        }
2114      }
2115    
2116      gtk_widget_destroy (dialog);
2117    }
2118    
2119    GtkWidget *export_file(char *sel_title, char **filename) {
2120      /* non-fremantle and classic gtk use a rather ugly and */
2121      /* complex layout */
2122    #ifndef FREMANTLE
2123      GtkWidget *vbox = gtk_vbox_new(FALSE, 0);
2124      GtkWidget *hbox = gtk_hbox_new(FALSE, 0);
2125      GtkWidget *label = gtk_label_new(_("Export to"));
2126      gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE,0);
2127      gtk_misc_set_alignment(GTK_MISC(label), 0.f, 0.5f);
2128      GtkWidget *button = button_new_with_label(_("Browse"));
2129      g_object_set_data(G_OBJECT(button), "sel_title", sel_title);
2130      g_object_set_data(G_OBJECT(button), "fileptr", filename);
2131      gtk_signal_connect(GTK_OBJECT(button), "clicked",
2132                         GTK_SIGNAL_FUNC(on_browse), NULL);
2133      gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE,0);
2134      gtk_box_pack_start_defaults(GTK_BOX(vbox), hbox);
2135    
2136      label = gtk_label_new((*filename)?*filename:"");
2137      g_object_set_data(G_OBJECT(button), "label", label);
2138      gtk_misc_set_alignment(GTK_MISC(label), 0.f, 0.5f);
2139      gtk_label_set_ellipsize(GTK_LABEL(label), PANGO_ELLIPSIZE_MIDDLE);
2140    
2141      gtk_box_pack_start_defaults(GTK_BOX(vbox), label);
2142      return vbox;
2143    #else
2144      GtkWidget *button = hildon_button_new_with_text(
2145              (HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH),
2146              HILDON_BUTTON_ARRANGEMENT_VERTICAL,
2147              _("Export to"), *filename);
2148      hildon_button_set_title_alignment(HILDON_BUTTON(button), 0.5, 0.5);
2149      hildon_button_set_value_alignment(HILDON_BUTTON(button), 0.5, 0.5);
2150      g_object_set_data(G_OBJECT(button), "sel_title", sel_title);
2151      g_object_set_data(G_OBJECT(button), "fileptr", filename);
2152      gtk_signal_connect(GTK_OBJECT(button), "clicked",
2153                         GTK_SIGNAL_FUNC(on_browse), NULL);
2154      return button;
2155    #endif
2156    }
2157    
2158    #ifdef FREMANTLE
2159    static int number_editor_get(GtkWidget *widget) {
2160      GtkWidget *entry = g_object_get_data(G_OBJECT(widget), "entry");
2161      g_assert(entry);
2162      const char *str = gtk_entry_get_text(GTK_ENTRY(entry));
2163      if(!str) return 0;
2164      return atoi(str);
2165    }
2166    
2167    static void number_editor_set(GtkWidget *widget, int num) {
2168      int min = (int)g_object_get_data(G_OBJECT(widget), "min");
2169      int max = (int)g_object_get_data(G_OBJECT(widget), "max");
2170    
2171      if(num < min) num = min;
2172      if(num > max) num = max;
2173    
2174      GtkWidget *btn_inc =
2175        (GtkWidget*)g_object_get_data(G_OBJECT(widget), "btn_inc");
2176      gtk_widget_set_sensitive(btn_inc, num < max);
2177    
2178      GtkWidget *btn_dec =
2179        (GtkWidget*)g_object_get_data(G_OBJECT(widget), "btn_dec");
2180      gtk_widget_set_sensitive(btn_dec, num > min);
2181    
2182      GtkWidget *entry = g_object_get_data(G_OBJECT(widget), "entry");
2183      g_assert(entry);
2184      char *str = g_strdup_printf("%d", num);
2185      gtk_entry_set_text(GTK_ENTRY(entry), str);
2186      g_free(str);
2187    }
2188    
2189    static void on_number_decrease(GtkWidget *widget, gpointer data) {
2190      number_editor_set(GTK_WIDGET(data),
2191        number_editor_get(GTK_WIDGET(data)) - 1);
2192    }
2193    
2194    static void on_number_increase(GtkWidget *widget, gpointer data) {
2195      number_editor_set(GTK_WIDGET(data),
2196        number_editor_get(GTK_WIDGET(data)) + 1);
2197    }
2198    
2199    static void on_number_changed(GtkWidget *widget, gpointer data) {
2200      number_editor_set(GTK_WIDGET(data),
2201        number_editor_get(GTK_WIDGET(data)));
2202    }
2203    #endif
2204    
2205    GtkWidget *number_editor_new(int current, int min, int max) {
2206    #ifndef USE_MAEMO
2207      GtkObject *adj = gtk_adjustment_new(current, min, max, 1, 10, 10);
2208      return gtk_spin_button_new(GTK_ADJUSTMENT(adj), 1, 0);
2209    #elif MAEMO_VERSION_MAJOR < 5
2210      GtkWidget *widget = hildon_number_editor_new(min, max);
2211      hildon_number_editor_set_value(HILDON_NUMBER_EDITOR(widget), current);
2212      return widget;
2213    #else
2214      GtkWidget *hbox = gtk_hbox_new(FALSE, 0);
2215      g_object_set_data(G_OBJECT(hbox), "min", (gpointer)min);
2216      g_object_set_data(G_OBJECT(hbox), "max", (gpointer)max);
2217    
2218      GtkWidget *btn_dec = button_new_with_label("  -  ");
2219      g_object_set_data(G_OBJECT(hbox), "btn_dec", btn_dec);
2220      gtk_signal_connect(GTK_OBJECT(btn_dec), "clicked",
2221                         (GtkSignalFunc)on_number_decrease, hbox);
2222      gtk_box_pack_start(GTK_BOX(hbox), btn_dec, FALSE, FALSE, 0);
2223    
2224      GtkWidget *entry = hildon_entry_new(HILDON_SIZE_AUTO);
2225      g_object_set_data(G_OBJECT(hbox), "entry", entry);
2226      g_signal_connect(G_OBJECT(entry), "changed",
2227                       G_CALLBACK(on_number_changed), hbox);
2228      gtk_entry_set_width_chars(GTK_ENTRY(entry), 2);
2229      hildon_gtk_entry_set_input_mode(GTK_ENTRY(entry),
2230                                      HILDON_GTK_INPUT_MODE_NUMERIC);
2231      gtk_box_pack_start_defaults(GTK_BOX(hbox), entry);
2232    
2233      GtkWidget *btn_inc = button_new_with_label("  +  ");
2234      g_object_set_data(G_OBJECT(hbox), "btn_inc", btn_inc);
2235      gtk_signal_connect(GTK_OBJECT(btn_inc), "clicked",
2236                         (GtkSignalFunc)on_number_increase, hbox);
2237      gtk_box_pack_start(GTK_BOX(hbox), btn_inc, FALSE, FALSE, 0);
2238    
2239      number_editor_set(hbox, current);
2240    
2241      return hbox;
2242    #endif
2243    }
2244    
2245    int number_editor_get_value(GtkWidget *widget) {
2246    #ifndef USE_MAEMO
2247      return gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget));
2248    #elif MAEMO_VERSION_MAJOR < 5
2249      return hildon_number_editor_get_value(HILDON_NUMBER_EDITOR(widget));
2250    #else
2251      return number_editor_get(widget);
2252    #endif
2253    }

Legend:
Removed from v.223  
changed lines
  Added in v.250