/* %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_sdir_close (); void gui_sdir_update (); void gui_sdir_clear (); void gui_sdir_clicklist (int nr); GUIWindow wsdir = {0}; GUIItem *wsd_close = NULL; GUIItem *wsd_path = NULL; GUIItem *wsd_dirlist = NULL; char **wsd_list = NULL; int wsd_listmax = 0; char wsd_select_dir[LEN_FILENAME]; char *gui_sdir_show (char *startpath) { if (wsdir.screen == NULL) gui_window_new (&wsdir, 220, 250, _("Select Dir")); wsdir.screen_changed = 1; wsdir.style = WGUI_S_VCENTER | WGUI_S_HCENTER; /* close Button */ if (wsd_close == NULL) wsd_close = gui_button_new (_("Close"), 50, 220, 100, 20); GUI_BUTTON_T (wsd_close)->callback_clicked = (void*) gui_sdir_close; gui_window_item_add (&wsdir, wsd_close); if (wsd_path == NULL) wsd_path = gui_entry_new (startpath, 10, 25, 200, 25); gui_window_item_add (&wsdir, wsd_path); if (wsd_dirlist == NULL) wsd_dirlist = gui_list_new (10, 55, 200, 140); GUI_LIST_T (wsd_dirlist)->callback_selectitem = gui_sdir_clicklist; GUI_LIST_T (wsd_dirlist)->data = wsd_list; gui_window_item_add (&wsdir, wsd_dirlist); gui_sdir_update (); gui_show (&wsdir); while (currentwin == &wsdir) { main_wnd_update (); } strncpy (wsd_select_dir, GUI_ENTRY_T(wsd_path)->text, LEN_FILENAME-1); if (wsd_select_dir[strlen(wsd_select_dir)-1] != DIR_SEP) { int i = strlen(wsd_select_dir); wsd_select_dir[i] = DIR_SEP; wsd_select_dir[i+1] = '\0'; } return wsd_select_dir; }; void gui_sdir_close () { gui_close (); }; void gui_sdir_clicklist (int nr) { char fname[LEN_FILENAME]; char *seperate; d_printf ("selected nr:%d '%s'", nr, nr < wsd_listmax ? wsd_list[nr] : "nr >= wsd_listmax"); if (nr >= wsd_listmax || wsd_list[nr] == NULL) return; if (strcmp (wsd_list[nr], ".") == 0) return; if (strcmp (wsd_list[nr], "..") == 0) { strncpy (fname, GUI_ENTRY_T(wsd_path)->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 (wsd_path, fname); } else { if (GUI_ENTRY_T(wsd_path)->text[strlen (GUI_ENTRY_T(wsd_path)->text)-1] == DIR_SEP) snprintf (fname, LEN_FILENAME, "%s%s", GUI_ENTRY_T(wsd_path)->text, wsd_list[nr]); else snprintf (fname, LEN_FILENAME, "%s%c%s", GUI_ENTRY_T(wsd_path)->text, DIR_SEP, wsd_list[nr]); gui_entry_settext (wsd_path, fname); } gui_sdir_update (); // wsdir.screen_changed = 1; // draw (); }; void gui_sdir_update () { int cnt; DIR *dir = NULL; struct dirent *direntry = NULL; char fname[LEN_FILENAME]; struct stat stbuf; /* clear list and reopen directory */ gui_sdir_clear (); if ((dir = opendir (GUI_ENTRY_T(wsd_path)->text)) == NULL) { /* if open fails, reopen with ROOT_DIR which is defined in system.h */ gui_entry_settext (wsd_path, ROOT_DIR); if ((dir = opendir (GUI_ENTRY_T(wsd_path)->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 = wsd_listmax = 0; /* need more memory? */ while ((direntry = readdir (dir))) { if (GUI_ENTRY_T(wsd_path)->text[strlen (GUI_ENTRY_T(wsd_path)->text)-1] == DIR_SEP) snprintf (fname, LEN_FILENAME, "%s%s", GUI_ENTRY_T(wsd_path)->text, direntry->d_name); else snprintf (fname, LEN_FILENAME, "%s%c%s", GUI_ENTRY_T(wsd_path)->text, DIR_SEP, direntry->d_name); if (stat(fname, &stbuf) == -1) { d_printf ("could not read stat of file: %s", fname); continue; } if (S_ISDIR(stbuf.st_mode)) { /* need more memory? */ if (cnt >= wsd_listmax) { /* save old pointer and counter */ char **tmp = wsd_list; int i = wsd_listmax-1; /* allocate new list */ wsd_listmax += 512; wsd_list = ml_malloc (wsd_listmax * sizeof(void*)); memset (wsd_list, 0x0, wsd_listmax * sizeof(void*)); /* copy list */ if (tmp) { for (; i >= 0; i--) wsd_list[i] = tmp[i]; ml_free (tmp); } /* setup new list */ GUI_LIST_T (wsd_dirlist)->data = wsd_list; } wsd_list[cnt] = ml_malloc (LEN_FILENAME); strncpy (wsd_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_sdir_clear () { int i; if (wsd_list == NULL) return; for (i = 0; wsd_list[i]; i++) { if (wsd_list[i]) ml_free (wsd_list[i]); wsd_list[i] = NULL; } };