1 /* $Id: file.c,v 1.12 2005-07-03 03:08:25 chris Exp $ */
3 THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
4 SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
5 END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
6 ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
7 IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
8 SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
9 FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
10 CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
11 AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
12 COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
16 static char rcsid[] = "$Id: file.c,v 1.12 2005-07-03 03:08:25 chris Exp $";
34 int file_sort_func(char **e0, char **e1)
36 return stricmp(*e0, *e1);
40 char **file_getdirlist(int *NumDirs, char *dir)
43 char **list = PHYSFS_enumerateFiles(dir);
53 strncat(path, "/", PATH_MAX - strlen(dir));
55 test_filename = path + strlen(path);
56 test_max = PATH_MAX - (test_filename - path);
58 for (i = list; *i; i++)
60 if (strlen(*i) >= test_max)
63 strcpy(test_filename, *i);
64 if (PHYSFS_isDirectory(path))
72 qsort(list, *NumDirs, sizeof(char *), (int (*)( const void *, const void * ))file_sort_func);
76 // Put the 'go to parent directory' sequence '..' first
78 list = realloc(list, sizeof(char *)*(*NumDirs + 1));
79 list[*NumDirs] = NULL; // terminate
80 for (i = list + *NumDirs - 1; i != list; i--)
82 list[0] = strdup("..");
88 char **file_getfilelist(int *NumFiles, char *filespec, char *dir)
90 char **list = PHYSFS_enumerateFiles(dir);
91 char **i, **j = list, *ext;
99 for (i = list; *i; i++)
101 ext = strrchr(*i, '.');
102 if (ext && (!stricmp(ext, filespec)))
110 *NumFiles = j - list;
111 qsort(list, *NumFiles, sizeof(char *), (int (*)( const void *, const void * ))file_sort_func);
116 int ui_get_filename( char * filename, char * Filespec, char * message )
118 char ViewDir[PATH_MAX];
119 char InputText[PATH_MAX];
121 PHYSFS_file *TempFile;
122 int NumFiles, NumDirs,i;
123 char **filename_list;
124 char **directory_list;
127 UI_GADGET_BUTTON *Button1, *Button2, *HelpButton;
128 UI_GADGET_LISTBOX *ListBox1;
129 UI_GADGET_LISTBOX *ListBox2;
130 UI_GADGET_INPUTBOX *UserFile;
133 if ((p = strrchr(filename, '/')))
136 strcpy(ViewDir, filename);
137 strcpy(InputText, p);
142 strcpy(InputText, filename);
145 filename_list = file_getfilelist(&NumFiles, Filespec, ViewDir);
146 directory_list = file_getdirlist(&NumDirs, ViewDir);
148 // Running out of memory may become likely in the future
149 if (!filename_list && !directory_list)
154 PHYSFS_freeList(directory_list);
160 PHYSFS_freeList(filename_list);
164 //MessageBox( -2,-2, 1,"DEBUG:0", "Ok" );
169 wnd = ui_open_window( 200, 100, 400, 370, WIN_DIALOG );
171 ui_wprintf_at( wnd, 10, 5, message );
173 ui_wprintf_at( wnd, 20, 32,"N&ame" );
174 UserFile = ui_add_gadget_inputbox( wnd, 60, 30, PATH_MAX, 40, InputText );
176 ui_wprintf_at( wnd, 20, 86,"&Files" );
177 ui_wprintf_at( wnd, 210, 86,"&Dirs" );
179 ListBox1 = ui_add_gadget_listbox(wnd, 20, 110, 125, 200, NumFiles, filename_list);
180 ListBox2 = ui_add_gadget_listbox(wnd, 210, 110, 100, 200, NumDirs, directory_list);
182 Button1 = ui_add_gadget_button( wnd, 20, 330, 60, 25, "Ok", NULL );
183 Button2 = ui_add_gadget_button( wnd, 100, 330, 60, 25, "Cancel", NULL );
184 HelpButton = ui_add_gadget_button( wnd, 180, 330, 60, 25, "Help", NULL );
186 wnd->keyboard_focus_gadget = (UI_GADGET *)UserFile;
188 Button1->hotkey = KEY_CTRLED + KEY_ENTER;
189 Button2->hotkey = KEY_ESC;
190 HelpButton->hotkey = KEY_F1;
191 ListBox1->hotkey = KEY_ALTED + KEY_F;
192 ListBox2->hotkey = KEY_ALTED + KEY_D;
193 UserFile->hotkey = KEY_ALTED + KEY_A;
195 ui_gadget_calc_keys(wnd);
197 ui_wprintf_at( wnd, 20, 60, "%s", Spaces );
198 ui_wprintf_at( wnd, 20, 60, "%s", ViewDir );
205 ui_window_do_gadgets(wnd);
207 if ( Button2->pressed )
209 PHYSFS_freeList(filename_list);
210 PHYSFS_freeList(directory_list);
211 ui_close_window(wnd);
215 if ( HelpButton->pressed )
216 MessageBox( -1, -1, 1, "Sorry, no help is available!", "Ok" );
218 if (ListBox1->moved || new_listboxes)
220 if (ListBox1->current_item >= 0 )
221 ui_inputbox_set_text(UserFile, filename_list[ListBox1->current_item]);
224 if (ListBox2->moved || new_listboxes)
226 if (ListBox2->current_item >= 0 )
227 ui_inputbox_set_text(UserFile, directory_list[ListBox2->current_item]);
231 if (Button1->pressed || UserFile->pressed || (ListBox1->selected_item > -1 ) || (ListBox2->selected_item > -1 ))
235 if (ListBox2->selected_item > -1 )
236 strcpy(UserFile->text, directory_list[ListBox2->selected_item]);
238 strncpy(filename, ViewDir, PATH_MAX);
241 while (!strncmp(p, "..", 2)) // shorten the path manually
243 char *sep = strrchr(filename, '/');
247 *filename = 0; // look directly in search paths
255 strncat(filename, "/", PATH_MAX - strlen(filename));
256 strncat(filename, p, PATH_MAX - strlen(filename));
258 if (!PHYSFS_isDirectory(filename))
260 TempFile = PHYSFS_openRead(filename);
263 // Looks like a valid filename that already exists!
264 PHYSFS_close(TempFile);
268 // File doesn't exist, but can we create it?
269 TempFile = PHYSFS_openWrite(filename);
272 // Looks like a valid filename!
273 PHYSFS_close(TempFile);
274 PHYSFS_delete(filename);
280 if (filename[strlen(filename) - 1] == '/') // user typed a separator on the end
281 filename[strlen(filename) - 1] = 0;
283 strcpy(ViewDir, filename);
285 //mprintf( 0, "----------------------------\n" );
286 //mprintf( 0, "Full dir: '%s'\n", ViewDir );
288 PHYSFS_freeList(filename_list);
289 filename_list = file_getfilelist(&NumFiles, Filespec, ViewDir);
292 PHYSFS_freeList(directory_list);
296 ui_inputbox_set_text(UserFile, Filespec);
298 PHYSFS_freeList(directory_list);
299 directory_list = file_getdirlist(&NumDirs, ViewDir);
302 PHYSFS_freeList(filename_list);
306 ui_listbox_change(wnd, ListBox1, NumFiles, filename_list);
307 ui_listbox_change(wnd, ListBox2, NumDirs, directory_list);
310 ui_wprintf_at( wnd, 20, 60, "%s", Spaces );
311 ui_wprintf_at( wnd, 20, 60, "%s", ViewDir );
314 //while ( TICKER < i+2 );
327 ui_close_window(wnd);
329 PHYSFS_freeList(filename_list);
331 PHYSFS_freeList(directory_list);
338 int ui_get_file( char * filename, char * Filespec )
341 char **list = file_getfilelist(&NumFiles, Filespec, "");
345 x = MenuX(-1, -1, NumFiles, list);
348 strcpy(filename, list[x - 1]);
350 PHYSFS_freeList(list);