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 244 by harbaum, Tue Dec 15 19:54:04 2009 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 1593  static pos_t goto_pos_get(GtkWidget *ite Line 1648  static pos_t goto_pos_get(GtkWidget *ite
1648    return  pos;    return  pos;
1649  }  }
1650    
1651    #if defined(ENABLE_MAEMO_MAPPER) && defined(ENABLE_OSM_GPS_MAP)
1652  #ifdef ENABLE_MAEMO_MAPPER  #ifdef ENABLE_MAEMO_MAPPER
1653  static void cb_mm_set(GtkWidget *item, gpointer data) {  static void cb_mm_set(GtkWidget *item, gpointer data) {
1654    appdata_t *appdata = (appdata_t*)data;    appdata_t *appdata = (appdata_t*)data;
# Line 1603  static void cb_mm_set(GtkWidget *item, g Line 1659  static void cb_mm_set(GtkWidget *item, g
1659  }  }
1660  #endif  #endif
1661    
1662    #ifdef ENABLE_OSM_GPS_MAP
1663  static void cb_map_set(GtkWidget *item, gpointer data) {  static void cb_map_set(GtkWidget *item, gpointer data) {
1664    appdata_t *appdata = (appdata_t*)data;    appdata_t *appdata = (appdata_t*)data;
1665    
# Line 1613  static void cb_map_set(GtkWidget *item, Line 1670  static void cb_map_set(GtkWidget *item,
1670                               pos.lat, pos.lon);                               pos.lat, pos.lon);
1671    }    }
1672  }  }
1673    #endif
1674    
1675  #ifndef PRESET_PICKER_DIALOG  #ifndef PRESET_PICKER_DIALOG
1676  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 1679  static GtkWidget *goto_popup_menu_create
1679    
1680  #if defined(ENABLE_OSM_GPS_MAP)  #if defined(ENABLE_OSM_GPS_MAP)
1681    menu_add(menu, appdata, icon_get_widget(ICON_POS, 20),    menu_add(menu, appdata, icon_get_widget(ICON_POS, 20),
1682             _("Map position"), cb_map_set, 0, lon_entry, lat_entry);             _("Internal map"), cb_map_set, 0, lon_entry, lat_entry);
1683  #endif  #endif
1684    
1685  #if defined(ENABLE_MAEMO_MAPPER)  #if defined(ENABLE_MAEMO_MAPPER)
1686    menu_add(menu, appdata, icon_get_widget(ICON_POS, 24),    menu_add(menu, appdata, icon_get_widget(ICON_POS, 24),
1687             _("Maemo mapper position"), cb_mm_set, 0, lon_entry, lat_entry);             _("Maemo Mapper"), cb_mm_set, 0, lon_entry, lat_entry);
1688  #endif  #endif
1689    
1690    gtk_widget_show_all(menu);    gtk_widget_show_all(menu);
# Line 1665  static GtkWidget *goto_picker_create(app Line 1723  static GtkWidget *goto_picker_create(app
1723    
1724  #if defined(ENABLE_OSM_GPS_MAP)  #if defined(ENABLE_OSM_GPS_MAP)
1725    preset_picker_add(store, appdata, icon_get(ICON_POS, 20),    preset_picker_add(store, appdata, icon_get(ICON_POS, 20),
1726                      _("Map position"), cb_map_set, 0);                      _("Internal map"), cb_map_set, 0);
1727  #endif  #endif
1728    
1729  #if defined(ENABLE_MAEMO_MAPPER)  #if defined(ENABLE_MAEMO_MAPPER)
1730    preset_picker_add(store, appdata, icon_get(ICON_POS, 24),    preset_picker_add(store, appdata, icon_get(ICON_POS, 24),
1731                      _("Maemo mapper position"), cb_mm_set, 0);                      _("Maemo Mapper"), cb_mm_set, 0);
1732  #endif  #endif
1733    
1734    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));
# Line 1694  static GtkWidget *goto_picker_create(app Line 1752  static GtkWidget *goto_picker_create(app
1752  #endif  #endif
1753  }  }
1754  #endif  #endif
1755    #endif
1756    
1757  static gint on_goto_button_press(GtkWidget *button,  static gint on_goto_button_press(GtkWidget *button,
1758                                   GdkEventButton *event, gpointer data) {                                   GdkEventButton *event, gpointer data) {
# Line 1704  static gint on_goto_button_press(GtkWidg Line 1763  static gint on_goto_button_press(GtkWidg
1763  #if defined(ENABLE_MAEMO_MAPPER) && !defined(ENABLE_OSM_GPS_MAP)  #if defined(ENABLE_MAEMO_MAPPER) && !defined(ENABLE_OSM_GPS_MAP)
1764      /* only maemo mapper is being used */      /* only maemo mapper is being used */
1765      pos_t pos = goto_pos_get(button);      pos_t pos = goto_pos_get(button);
1766      if(!isnan(pos.lat) && !isnan(pos.lon)) {      if(!isnan(pos.lat) && !isnan(pos.lon))
1767        dbus_mm_set_position(appdata, &pos);        dbus_mm_set_position(appdata, &pos);
1768  #elif !defined(ENABLE_MAEMO_MAPPER) && defined(ENABLE_OSM_GPS_MAP)  #elif !defined(ENABLE_MAEMO_MAPPER) && defined(ENABLE_OSM_GPS_MAP)
1769      /* only internal map is being used */      /* only internal map is being used */
# Line 1733  static gint on_goto_button_press(GtkWidg Line 1792  static gint on_goto_button_press(GtkWidg
1792                     event->button, event->time);                     event->button, event->time);
1793  #else  #else
1794      GtkWidget *dialog =      GtkWidget *dialog =
1795        gtk_dialog_new_with_buttons(_("Map coordinates"),        gtk_dialog_new_with_buttons(_("Show coordinate on map"),
1796            GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(button))),            GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(button))),
1797                                    GTK_DIALOG_MODAL,                                    GTK_DIALOG_MODAL,
1798            GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,            GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
# Line 1765  GtkWidget *goto_coordinate(appdata_t *ap Line 1824  GtkWidget *goto_coordinate(appdata_t *ap
1824    
1825    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));
1826    
1827    gtk_widget_set_tooltip_text(button, _("Goto coordinates"));  #ifndef USE_MAEMO
1828      gtk_widget_set_tooltip_text(button, _("Show coordinate on map"));
1829    #endif
1830    
1831    g_object_set_data(G_OBJECT(button), "lat_entry", (gpointer)lat_entry);    g_object_set_data(G_OBJECT(button), "lat_entry", (gpointer)lat_entry);
1832    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 1914  GtkWidget *angle_entry_new(float angle) Line 1975  GtkWidget *angle_entry_new(float angle)
1975  #endif  #endif
1976    return widget;    return widget;
1977  }  }
1978    
1979  float angle_entry_get(GtkWidget *widget) {  float angle_entry_get(GtkWidget *widget) {
1980  #ifndef COORDINATE_PICKER  #ifndef COORDINATE_PICKER
1981    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 1997  void angle_entry_set(GtkWidget *widget,
1997    g_signal_emit_by_name(widget, "changed");    g_signal_emit_by_name(widget, "changed");
1998  #endif  #endif
1999  }  }
2000    
2001    GtkWidget *toggle_button_new_with_label(char *label) {
2002    #if !defined(USE_MAEMO) || (MAEMO_VERSION_MAJOR < 5)
2003      return gtk_check_button_new_with_label(label);
2004    #else
2005      GtkWidget *cbut = gtk_toggle_button_new_with_label(label);
2006      hildon_gtk_widget_set_theme_size(cbut,
2007               (HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH));
2008      gtk_toggle_button_set_mode(GTK_TOGGLE_BUTTON(cbut), FALSE);
2009      return cbut;
2010    #endif
2011    }
2012    
2013    void toggle_button_set_active(GtkWidget *button, gboolean active) {
2014      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), active);
2015    }
2016    
2017    gboolean toggle_button_get_active(GtkWidget *button) {
2018      return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button));
2019    }
2020    
2021    GtkWidget *check_button_new_with_label(char *label) {
2022    #if !defined(USE_MAEMO) || (MAEMO_VERSION_MAJOR < 5)
2023      return gtk_check_button_new_with_label(label);
2024    #else
2025      GtkWidget *cbut =
2026        hildon_check_button_new(HILDON_SIZE_FINGER_HEIGHT |
2027                                HILDON_SIZE_AUTO_WIDTH);
2028      gtk_button_set_label(GTK_BUTTON(cbut), label);
2029      return cbut;
2030    #endif
2031    }
2032    
2033    void check_button_set_active(GtkWidget *button, gboolean active) {
2034    #if !defined(USE_MAEMO) || (MAEMO_VERSION_MAJOR < 5)
2035      gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), active);
2036    #else
2037      hildon_check_button_set_active(HILDON_CHECK_BUTTON(button), active);
2038    #endif
2039    }
2040    
2041    gboolean check_button_get_active(GtkWidget *button) {
2042    #if !defined(USE_MAEMO) || (MAEMO_VERSION_MAJOR < 5)
2043      return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button));
2044    #else
2045      return hildon_check_button_get_active(HILDON_CHECK_BUTTON(button));
2046    #endif
2047    }
2048    
2049    GtkWidget *button_new(void) {
2050      GtkWidget *button = gtk_button_new();
2051    #if defined(USE_MAEMO) && (MAEMO_VERSION_MAJOR == 5)
2052      hildon_gtk_widget_set_theme_size(button,
2053               (HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH));
2054    #endif
2055      return button;
2056    }
2057    
2058    GtkWidget *button_new_with_label(char *label) {
2059      GtkWidget *button = gtk_button_new_with_label(label);
2060    #if defined(USE_MAEMO) && (MAEMO_VERSION_MAJOR == 5)
2061      hildon_gtk_widget_set_theme_size(button,
2062               (HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH));
2063    #endif
2064      return button;
2065    }
2066    
2067    static void on_browse(GtkWidget *widget, gpointer data) {
2068      GtkWidget *dialog;
2069    
2070      char **fileptr = g_object_get_data(G_OBJECT(widget), "fileptr");
2071    
2072    #ifdef USE_MAEMO
2073      dialog = hildon_file_chooser_dialog_new(
2074                   GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(widget))),
2075                   GTK_FILE_CHOOSER_ACTION_SAVE);
2076    #else
2077      dialog = gtk_file_chooser_dialog_new(
2078                   g_object_get_data(G_OBJECT(widget), "sel_title"),
2079                   GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(widget))),
2080                   GTK_FILE_CHOOSER_ACTION_SAVE,
2081                   GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
2082                   GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
2083                   NULL);
2084    #endif
2085    
2086      if(*fileptr) {
2087        printf("set filename <%s>\n", *fileptr);
2088    
2089        if(!g_file_test(*fileptr, G_FILE_TEST_EXISTS)) {
2090          char *last_sep = strrchr(*fileptr, '/');
2091          if(last_sep) {
2092            *last_sep = 0;  // seperate path from file
2093    
2094            /* the user just created a new document */
2095            gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog),
2096                                                *fileptr);
2097            gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog),
2098                                              last_sep+1);
2099    
2100            /* restore full filename */
2101            *last_sep = '/';
2102          }
2103        } else
2104          gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), *fileptr);
2105      }
2106    
2107      if (gtk_dialog_run (GTK_DIALOG(dialog)) == GTK_FM_OK) {
2108        gchar *name = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
2109        if(name) {
2110          if(*fileptr) g_free(*fileptr);
2111          *fileptr = g_strdup(name);
2112    
2113    #ifndef FREMANTLE
2114          GtkWidget *label = g_object_get_data(G_OBJECT(widget), "label");
2115          gtk_label_set_text(GTK_LABEL(label), *fileptr);
2116    #else
2117          hildon_button_set_value(HILDON_BUTTON(widget), *fileptr);
2118    #endif
2119        }
2120      }
2121    
2122      gtk_widget_destroy (dialog);
2123    }
2124    
2125    GtkWidget *export_file(char *sel_title, char **filename) {
2126      /* non-fremantle and classic gtk use a rather ugly and */
2127      /* complex layout */
2128    #ifndef FREMANTLE
2129      GtkWidget *vbox = gtk_vbox_new(FALSE, 0);
2130      GtkWidget *hbox = gtk_hbox_new(FALSE, 0);
2131      GtkWidget *label = gtk_label_new(_("Export to"));
2132      gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE,0);
2133      gtk_misc_set_alignment(GTK_MISC(label), 0.f, 0.5f);
2134      GtkWidget *button = button_new_with_label(_("Browse"));
2135      g_object_set_data(G_OBJECT(button), "sel_title", sel_title);
2136      g_object_set_data(G_OBJECT(button), "fileptr", filename);
2137      gtk_signal_connect(GTK_OBJECT(button), "clicked",
2138                         GTK_SIGNAL_FUNC(on_browse), NULL);
2139      gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE,0);
2140      gtk_box_pack_start_defaults(GTK_BOX(vbox), hbox);
2141    
2142      label = gtk_label_new((*filename)?*filename:"");
2143      g_object_set_data(G_OBJECT(button), "label", label);
2144      gtk_misc_set_alignment(GTK_MISC(label), 0.f, 0.5f);
2145      gtk_label_set_ellipsize(GTK_LABEL(label), PANGO_ELLIPSIZE_MIDDLE);
2146    
2147      gtk_box_pack_start_defaults(GTK_BOX(vbox), label);
2148      return vbox;
2149    #else
2150      GtkWidget *button = hildon_button_new_with_text(
2151              (HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH),
2152              HILDON_BUTTON_ARRANGEMENT_VERTICAL,
2153              _("Export to"), *filename);
2154      hildon_button_set_title_alignment(HILDON_BUTTON(button), 0.5, 0.5);
2155      hildon_button_set_value_alignment(HILDON_BUTTON(button), 0.5, 0.5);
2156      g_object_set_data(G_OBJECT(button), "sel_title", sel_title);
2157      g_object_set_data(G_OBJECT(button), "fileptr", filename);
2158      gtk_signal_connect(GTK_OBJECT(button), "clicked",
2159                         GTK_SIGNAL_FUNC(on_browse), NULL);
2160      return button;
2161    #endif
2162    }
2163    
2164    static int number_editor_get(GtkWidget *widget) {
2165      GtkWidget *entry = g_object_get_data(G_OBJECT(widget), "entry");
2166      g_assert(entry);
2167      const char *str = gtk_entry_get_text(GTK_ENTRY(entry));
2168      if(!str) return 0;
2169      return atoi(str);
2170    }
2171    
2172    static void number_editor_set(GtkWidget *widget, int num) {
2173      int min = (int)g_object_get_data(G_OBJECT(widget), "min");
2174      int max = (int)g_object_get_data(G_OBJECT(widget), "max");
2175    
2176      if(num < min) num = min;
2177      if(num > max) num = max;
2178    
2179      GtkWidget *btn_inc =
2180        (GtkWidget*)g_object_get_data(G_OBJECT(widget), "btn_inc");
2181      gtk_widget_set_sensitive(btn_inc, num < max);
2182    
2183      GtkWidget *btn_dec =
2184        (GtkWidget*)g_object_get_data(G_OBJECT(widget), "btn_dec");
2185      gtk_widget_set_sensitive(btn_dec, num > min);
2186    
2187      GtkWidget *entry = g_object_get_data(G_OBJECT(widget), "entry");
2188      g_assert(entry);
2189      char *str = g_strdup_printf("%d", num);
2190      gtk_entry_set_text(GTK_ENTRY(entry), str);
2191      g_free(str);
2192    }
2193    
2194    static void on_number_decrease(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_increase(GtkWidget *widget, gpointer data) {
2200      number_editor_set(GTK_WIDGET(data),
2201        number_editor_get(GTK_WIDGET(data)) + 1);
2202    }
2203    
2204    static void on_number_changed(GtkWidget *widget, gpointer data) {
2205      number_editor_set(GTK_WIDGET(data),
2206        number_editor_get(GTK_WIDGET(data)));
2207    }
2208    
2209    GtkWidget *number_editor_new(int current, int min, int max) {
2210    #ifndef USE_MAEMO
2211      GtkObject *adj = gtk_adjustment_new(current, min, max, 1, 10, 10);
2212      return gtk_spin_button_new(GTK_ADJUSTMENT(adj), 1, 0);
2213    #elif MAEMO_VERSION_MAJOR < 5
2214      GtkWidget *widget = hildon_number_editor_new(min, max);
2215      hildon_number_editor_set_value(HILDON_NUMBER_EDITOR(widget), current);
2216      return widget;
2217    #else
2218      GtkWidget *hbox = gtk_hbox_new(FALSE, 0);
2219      g_object_set_data(G_OBJECT(hbox), "min", (gpointer)min);
2220      g_object_set_data(G_OBJECT(hbox), "max", (gpointer)max);
2221    
2222      GtkWidget *btn_dec = button_new_with_label("  -  ");
2223      g_object_set_data(G_OBJECT(hbox), "btn_dec", btn_dec);
2224      gtk_signal_connect(GTK_OBJECT(btn_dec), "clicked",
2225                         (GtkSignalFunc)on_number_decrease, hbox);
2226      gtk_box_pack_start(GTK_BOX(hbox), btn_dec, FALSE, FALSE, 0);
2227    
2228      GtkWidget *entry = hildon_entry_new(HILDON_SIZE_AUTO);
2229      g_object_set_data(G_OBJECT(hbox), "entry", entry);
2230      g_signal_connect(G_OBJECT(entry), "changed",
2231                       G_CALLBACK(on_number_changed), hbox);
2232      gtk_entry_set_width_chars(GTK_ENTRY(entry), 2);
2233      hildon_gtk_entry_set_input_mode(GTK_ENTRY(entry),
2234                                      HILDON_GTK_INPUT_MODE_NUMERIC);
2235      gtk_box_pack_start_defaults(GTK_BOX(hbox), entry);
2236    
2237      GtkWidget *btn_inc = button_new_with_label("  +  ");
2238      g_object_set_data(G_OBJECT(hbox), "btn_inc", btn_inc);
2239      gtk_signal_connect(GTK_OBJECT(btn_inc), "clicked",
2240                         (GtkSignalFunc)on_number_increase, hbox);
2241      gtk_box_pack_start(GTK_BOX(hbox), btn_inc, FALSE, FALSE, 0);
2242    
2243      number_editor_set(hbox, current);
2244    
2245      return hbox;
2246    #endif
2247    }
2248    
2249    int number_editor_get_value(GtkWidget *widget) {
2250    #ifndef USE_MAEMO
2251      return gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget));
2252    #elif MAEMO_VERSION_MAJOR < 5
2253      return hildon_number_editor_get_value(HILDON_NUMBER_EDITOR(widget));
2254    #else
2255      return number_editor_get(widget);
2256    #endif
2257    }

Legend:
Removed from v.231  
changed lines
  Added in v.244