Diff of /trunk/src/misc.c

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

revision 231 by harbaum, Mon Dec 7 16:14:50 2009 UTC revision 250 by harbaum, Sat Jan 23 20:12:41 2010 UTC
# Line 38  Line 38 
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 50  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 567  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 611  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];
# 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 753  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 785  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 798  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 973  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 1176  static void cb_map(GtkWidget *item, gpoi Line 1229  static void cb_map(GtkWidget *item, gpoi
1229  static void cb_mm(GtkWidget *item, gpointer data) {  static void cb_mm(GtkWidget *item, gpointer data) {
1230    appdata_t *appdata = (appdata_t*)data;    appdata_t *appdata = (appdata_t*)data;
1231    
1232    pos_set(item, appdata->mmpos.lat, appdata->mpos.lon);    pos_set(item, appdata->mmpos.lat, appdata->mmpos.lon);
1233  }  }
1234  #endif  #endif
1235    
# Line 1267  static GtkWidget *popup_menu_create(appd Line 1320  static GtkWidget *popup_menu_create(appd
1320  #ifdef ENABLE_MAEMO_MAPPER  #ifdef ENABLE_MAEMO_MAPPER
1321    if(appdata->mmpos_valid) {    if(appdata->mmpos_valid) {
1322      menu_add(menu, appdata, icon_get_widget(ICON_POS, 24),      menu_add(menu, appdata, icon_get_widget(ICON_POS, 24),
1323               _("Maemo mapper position"), cb_mm, 0, lon_entry, lat_entry);               _("Maemo Mapper position"), cb_mm, 0, lon_entry, lat_entry);
1324    }    }
1325  #endif  #endif
1326    
# Line 1457  static GtkWidget *preset_picker_create(a Line 1510  static GtkWidget *preset_picker_create(a
1510    
1511  #ifdef ENABLE_MAEMO_MAPPER  #ifdef ENABLE_MAEMO_MAPPER
1512    if(appdata->mmpos_valid) {    if(appdata->mmpos_valid) {
1513      preset_picker_add(menu, appdata, icon_get(ICON_POS, 24),      preset_picker_add(store, appdata, icon_get(ICON_POS, 24),
1514                        _("Maemo mapper position"), cb_mm, 0);                        _("Maemo Mapper position"), cb_mm, 0);
1515    }    }
1516  #endif  #endif
1517    
# Line 1527  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 1556  GtkWidget *preset_coordinate_picker(appd Line 1609  GtkWidget *preset_coordinate_picker(appd
1609    
1610    gtk_button_set_image(GTK_BUTTON(button), icon_get_widget(ICON_POS, 22));    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 1580  GtkWidget *preset_coordinate_picker(appd Line 1635  GtkWidget *preset_coordinate_picker(appd
1635    return button;    return button;
1636  }  }
1637    
 #if defined(ENABLE_MAEMO_MAPPER) || defined(ENABLE_OSM_GPS_MAP)  
1638  static pos_t goto_pos_get(GtkWidget *item) {  static pos_t goto_pos_get(GtkWidget *item) {
1639    pos_t pos;    pos_t pos;
1640    
# Line 1603  static void cb_mm_set(GtkWidget *item, g Line 1657  static void cb_mm_set(GtkWidget *item, g
1657  }  }
1658  #endif  #endif
1659    
1660    #ifdef ENABLE_OSM_GPS_MAP
1661  static void cb_map_set(GtkWidget *item, gpointer data) {  static void cb_map_set(GtkWidget *item, gpointer data) {
1662    appdata_t *appdata = (appdata_t*)data;    appdata_t *appdata = (appdata_t*)data;
1663    
# Line 1613  static void cb_map_set(GtkWidget *item, Line 1668  static void cb_map_set(GtkWidget *item,
1668                               pos.lat, pos.lon);                               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  #ifndef PRESET_PICKER_DIALOG
1689  static GtkWidget *goto_popup_menu_create(appdata_t *appdata,  static GtkWidget *goto_popup_menu_create(appdata_t *appdata,
# Line 1621  static GtkWidget *goto_popup_menu_create Line 1692  static GtkWidget *goto_popup_menu_create
1692    
1693  #if defined(ENABLE_OSM_GPS_MAP)  #if defined(ENABLE_OSM_GPS_MAP)
1694    menu_add(menu, appdata, icon_get_widget(ICON_POS, 20),    menu_add(menu, appdata, icon_get_widget(ICON_POS, 20),
1695             _("Map position"), cb_map_set, 0, lon_entry, lat_entry);             _("Internal map"), cb_map_set, 0, lon_entry, lat_entry);
1696  #endif  #endif
1697    
1698  #if defined(ENABLE_MAEMO_MAPPER)  #if defined(ENABLE_MAEMO_MAPPER)
1699    menu_add(menu, appdata, icon_get_widget(ICON_POS, 24),    menu_add(menu, appdata, icon_get_widget(ICON_POS, 24),
1700             _("Maemo mapper position"), cb_mm_set, 0, lon_entry, lat_entry);             _("Maemo Mapper"), cb_mm_set, 0, lon_entry, lat_entry);
1701  #endif  #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);    gtk_widget_show_all(menu);
1707    
# Line 1665  static GtkWidget *goto_picker_create(app Line 1739  static GtkWidget *goto_picker_create(app
1739    
1740  #if defined(ENABLE_OSM_GPS_MAP)  #if defined(ENABLE_OSM_GPS_MAP)
1741    preset_picker_add(store, appdata, icon_get(ICON_POS, 20),    preset_picker_add(store, appdata, icon_get(ICON_POS, 20),
1742                      _("Map position"), cb_map_set, 0);                      _("Internal map"), cb_map_set, 0);
1743  #endif  #endif
1744    
1745  #if defined(ENABLE_MAEMO_MAPPER)  #if defined(ENABLE_MAEMO_MAPPER)
1746    preset_picker_add(store, appdata, icon_get(ICON_POS, 24),    preset_picker_add(store, appdata, icon_get(ICON_POS, 24),
1747                      _("Maemo mapper position"), cb_mm_set, 0);                      _("Maemo Mapper"), cb_mm_set, 0);
1748  #endif  #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));    gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(store));
1754    g_object_unref(store);    g_object_unref(store);
1755    
# Line 1701  static gint on_goto_button_press(GtkWidg Line 1778  static gint on_goto_button_press(GtkWidg
1778    
1779    if(event->type == GDK_BUTTON_PRESS) {    if(event->type == GDK_BUTTON_PRESS) {
1780    
 #if defined(ENABLE_MAEMO_MAPPER) && !defined(ENABLE_OSM_GPS_MAP)  
     /* only maemo mapper is being used */  
     pos_t pos = goto_pos_get(button);  
     if(!isnan(pos.lat) && !isnan(pos.lon)) {  
       dbus_mm_set_position(appdata, &pos);  
 #elif !defined(ENABLE_MAEMO_MAPPER) && defined(ENABLE_OSM_GPS_MAP)  
     /* only internal map is being used */  
     pos_t pos = goto_pos_get(button);  
     if(!isnan(pos.lat) && !isnan(pos.lon)) {  
       map(appdata);  
       osm_gps_map_set_center(OSM_GPS_MAP(appdata->map.context->widget),  
                              pos.lat, pos.lon);  
     }  
 #else  
   
1781      gpointer lat_entry = g_object_get_data(G_OBJECT(button), "lat_entry");      gpointer lat_entry = g_object_get_data(G_OBJECT(button), "lat_entry");
1782      g_assert(lat_entry);      g_assert(lat_entry);
1783      gpointer lon_entry = g_object_get_data(G_OBJECT(button), "lon_entry");      gpointer lon_entry = g_object_get_data(G_OBJECT(button), "lon_entry");
# Line 1733  static gint on_goto_button_press(GtkWidg Line 1795  static gint on_goto_button_press(GtkWidg
1795                     event->button, event->time);                     event->button, event->time);
1796  #else  #else
1797      GtkWidget *dialog =      GtkWidget *dialog =
1798        gtk_dialog_new_with_buttons(_("Map coordinates"),        gtk_dialog_new_with_buttons(_("Show coordinate on map"),
1799            GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(button))),            GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(button))),
1800                                    GTK_DIALOG_MODAL,                                    GTK_DIALOG_MODAL,
1801            GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,            GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
# Line 1748  static gint on_goto_button_press(GtkWidg Line 1810  static gint on_goto_button_press(GtkWidg
1810      gtk_dialog_run(GTK_DIALOG(dialog));      gtk_dialog_run(GTK_DIALOG(dialog));
1811      gtk_widget_destroy(dialog);      gtk_widget_destroy(dialog);
1812  #endif  #endif
   
 #endif  
1813    
1814      return TRUE;      return TRUE;
1815    }    }
# Line 1765  GtkWidget *goto_coordinate(appdata_t *ap Line 1825  GtkWidget *goto_coordinate(appdata_t *ap
1825    
1826    gtk_button_set_image(GTK_BUTTON(button), icon_get_widget(ICON_POS, 23));    gtk_button_set_image(GTK_BUTTON(button), icon_get_widget(ICON_POS, 23));
1827    
1828    gtk_widget_set_tooltip_text(button, _("Goto coordinates"));  #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);    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);    g_object_set_data(G_OBJECT(button), "lon_entry", (gpointer)lon_entry);
# Line 1785  GtkWidget *goto_coordinate(appdata_t *ap Line 1847  GtkWidget *goto_coordinate(appdata_t *ap
1847    
1848    return button;    return button;
1849  }  }
 #else  
 /* no map installed */  
 GtkWidget *goto_coordinate(appdata_t *appdata,  
                      GtkWidget *lat_entry, GtkWidget *lon_entry) {  
   return gtk_label_new("");  
 }  
 #endif  
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)
# Line 1914  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 1936  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.231  
changed lines
  Added in v.250