From dc3b085f0ff52775c3ef60305266c862f70bd032 Mon Sep 17 00:00:00 2001 From: steffen Date: Tue, 20 Aug 2013 19:10:05 +0000 Subject: [PATCH] android added compiler files --- android/jni/Android.mk | 3 +- main/gui_selectfile.c | 192 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 194 insertions(+), 1 deletion(-) create mode 100644 main/gui_selectfile.c 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; + } +}; +