diff --git a/android/jni/Android.mk b/android/jni/Android.mk
index f3a81b7..d42f546 100644
--- a/android/jni/Android.mk
+++ b/android/jni/Android.mk
@@ -81,7 +81,8 @@ LOCAL_SRC_FILES := \
draw/draw.c draw/draw_favorites.c draw/draw_gps.c draw/draw_gui.c draw/draw_route.c \
main/favorites.c main/gui_buttons.c main/gui_mainmenu.c main/guiw_gpsfile.c \
main/main.c main/routing.c main/gps.c main/gui_favorites.c \
- main/gui_search.c main/gui_config.c main/gui_selectdir.c main/linux_gps.c
+ main/gui_search.c main/gui_config.c main/gui_selectdir.c main/gui_selectfile.c \
+ main/linux_gps.c main/wnd_routing.c
# LOCAL_LDLIBS := -shared -llog -landroid -lEGL -lGLESv1_CM -lz
LOCAL_LDLIBS := -shared -llog -landroid -lEGL -lGLESv2 -lz
LOCAL_STATIC_LIBRARIES := android_native_app_glue zlib png freetype2-static
diff --git a/main/gui_selectfile.c b/main/gui_selectfile.c
new file mode 100644
index 0000000..8b66344
--- /dev/null
+++ b/main/gui_selectfile.c
@@ -0,0 +1,192 @@
+/* %Id: Exp $ */
+/***************************************************************************
+ * gui_selectdir.c
+ *
+ * Copyright (C) 2013 Steffen Pohle
+ * steffen@gulpe.de
+ ****************************************************************************/
+
+/*
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * main.c is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see .
+ */
+
+#include "osmroute.h"
+#include "draw.h"
+#include "gui.h"
+#include "system.h"
+
+#include
+#include
+
+void gui_sfile_close ();
+void gui_sfile_update ();
+void gui_sfile_clear ();
+void gui_sfile_clicklist (int nr);
+
+GUIWindow wsfile = {0};
+GUIItem *wsf_close = NULL;
+GUIItem *wsf_file = NULL;
+GUIItem *wsf_flist = NULL;
+
+char **wsf_list = NULL;
+int wsf_listmax = 0;
+char wsf_select_file[LEN_FILENAME];
+
+char *gui_sfile_show (char *startpath) {
+ if (wsfile.screen == NULL) gui_window_new (&wsfile, 220, 250, _("Select File"));
+ wsfile.screen_changed = 1;
+ wsfile.style = WGUI_S_VCENTER | WGUI_S_HCENTER;
+
+ /* close Button */
+ if (wsf_close == NULL) wsf_close = gui_button_new (_("Close"), 50, 220, 100, 20);
+ GUI_BUTTON_T (wsf_close)->callback_clicked = (void*) gui_sfile_close;
+ gui_window_item_add (&wsfile, wsf_close);
+
+ if (wsf_file == NULL) wsf_file = gui_entry_new (startpath, 10, 25, 200, 25);
+ gui_window_item_add (&wsfile, wsf_file);
+
+ if (wsf_flist == NULL) wsf_flist = gui_list_new (10, 55, 200, 140);
+ GUI_LIST_T (wsf_flist)->callback_selectitem = gui_sfile_clicklist;
+ GUI_LIST_T (wsf_flist)->data = wsf_flist;
+ gui_window_item_add (&wsfile, wsf_flist);
+
+ gui_sfile_update ();
+
+ gui_show (&wsfile);
+ while (currentwin == &wsfile) {
+ main_wnd_update ();
+ }
+ strncpy (wsf_select_file, GUI_ENTRY_T(wsf_file)->text, LEN_FILENAME-1);
+
+ return wsf_select_file;
+};
+
+
+void gui_sfile_close () {
+ gui_close ();
+};
+
+
+void gui_sfile_clicklist (int nr) {
+ char fname[LEN_FILENAME];
+ char *seperate;
+
+ d_printf ("selected nr:%d '%s'", nr, nr < wsf_listmax ? wsf_list[nr] : "nr >= wsf_listmax");
+ if (nr >= wsf_listmax || wsf_list[nr] == NULL) return;
+
+ if (strcmp (wsf_list[nr], ".") == 0) return;
+ if (strcmp (wsf_list[nr], "..") == 0) {
+ strncpy (fname, GUI_ENTRY_T(wsf_file)->text, LEN_FILENAME);
+ while (strlen (fname)>1 && fname[strlen (fname) -1] == DIR_SEP)
+ fname[strlen (fname)-1] = '\0';
+ if (strlen (fname) > 1) {
+ seperate = strrchr(fname, DIR_SEP);
+ if (seperate != NULL) {
+ seperate[0] = '\0';
+ }
+ }
+ gui_entry_settext (wsf_file, fname);
+ }
+ else {
+ if (GUI_ENTRY_T(wsf_file)->text[strlen (GUI_ENTRY_T(wsf_file)->text)-1] == DIR_SEP)
+ snprintf (fname, LEN_FILENAME, "%s%s", GUI_ENTRY_T(wsf_file)->text, wsf_list[nr]);
+ else
+ snprintf (fname, LEN_FILENAME, "%s%c%s", GUI_ENTRY_T(wsf_file)->text, DIR_SEP, wsf_file[nr]);
+
+ gui_entry_settext (wsf_file, fname);
+ }
+
+ gui_sfile_update ();
+};
+
+
+void gui_sfile_update () {
+ int cnt;
+ DIR *dir = NULL;
+ struct dirent *direntry = NULL;
+ char fname[LEN_FILENAME];
+ struct stat stbuf;
+
+ /* clear list and reopen directory */
+ gui_sfile_clear ();
+ if ((dir = opendir (GUI_ENTRY_T(wsf_file)->text)) == NULL) {
+ /* if open fails, reopen with ROOT_DIR which is defined in system.h */
+ gui_entry_settext (wsf_file, ROOT_DIR);
+ if ((dir = opendir (GUI_ENTRY_T(wsf_file)->text)) == NULL) {
+ d_printf ("could not open dir for reading. errno:%d '%s'", errno, strerror(errno));
+ return;
+ }
+ }
+
+ /* go through the directory but only add directory entries */
+ cnt = wsf_listmax = 0;
+
+ /* need more memory? */
+ while ((direntry = readdir (dir))) {
+ if (GUI_ENTRY_T(wsf_file)->text[strlen (GUI_ENTRY_T(wsf_file)->text)-1] == DIR_SEP)
+ snprintf (fname, LEN_FILENAME, "%s%s", GUI_ENTRY_T(wsf_file)->text, direntry->d_name);
+ else
+ snprintf (fname, LEN_FILENAME, "%s%c%s", GUI_ENTRY_T(wsf_file)->text, DIR_SEP, direntry->d_name);
+ if (stat(fname, &stbuf) == -1) {
+ d_printf ("could not read stat of file: %s", fname);
+ continue;
+ }
+ d_printf ("dir:%s", fname);
+ if (S_ISDIR(stbuf.st_mode)) {
+ /* need more memory? */
+ if (cnt >= wsf_listmax) {
+ /* save old pointer and counter */
+ char **tmp = wsf_list;
+ int i = wsf_listmax-1;
+
+ /* allocate new list */
+ wsf_listmax += 512;
+ wsf_list = ml_malloc (wsf_listmax * sizeof(void*));
+ memset (wsf_list, 0x0, wsf_listmax * sizeof(void*));
+
+ /* copy list */
+ if (tmp) {
+ for (; i >= 0; i--) wsf_list[i] = tmp[i];
+ ml_free (tmp);
+ }
+
+ /* setup new list */
+ GUI_LIST_T (wsf_flist)->data = wsf_list;
+ }
+
+ wsf_list[cnt] = ml_malloc (LEN_FILENAME);
+ strncpy (wsf_list[cnt], direntry->d_name, LEN_FILENAME);
+ d_printf ("added entry:%-3d '%s'", cnt, direntry->d_name);
+ cnt++;
+ }
+ }
+
+ closedir (dir);
+};
+
+
+/*
+ * remove all listentrys and free list
+ */
+void gui_sfile_clear () {
+ int i;
+
+ if (wsf_list == NULL) return;
+
+ for (i = 0; wsf_list[i]; i++) {
+ if (wsf_list[i]) ml_free (wsf_list[i]);
+ wsf_list[i] = NULL;
+ }
+};
+