2 THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
3 SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
4 END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
5 ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
6 IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
7 SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
8 FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
9 CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
10 AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
11 COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
32 int file_sort_func(char **e0, char **e1)
34 return stricmp(*e0, *e1);
38 char **file_getdirlist(int *NumDirs, char *dir)
41 char **list = PHYSFS_enumerateFiles(dir);
51 strncat(path, "/", PATH_MAX - strlen(dir));
53 test_filename = path + strlen(path);
54 test_max = (int)(PATH_MAX - (test_filename - path));
56 for (i = list; *i; i++)
58 if (strlen(*i) >= test_max)
61 strcpy(test_filename, *i);
62 if (PHYSFS_isDirectory(path))
69 *NumDirs = (int)(j - list);
70 qsort(list, *NumDirs, sizeof(char *), (int (*)( const void *, const void * ))file_sort_func);
74 // Put the 'go to parent directory' sequence '..' first
76 list = realloc(list, sizeof(char *)*(*NumDirs + 1));
77 list[*NumDirs] = NULL; // terminate
78 for (i = list + *NumDirs - 1; i != list; i--)
80 list[0] = strdup("..");
86 char **file_getfilelist(int *NumFiles, char *filespec, char *dir)
88 char **list = PHYSFS_enumerateFiles(dir);
89 char **i, **j = list, *ext;
97 for (i = list; *i; i++)
99 ext = strrchr(*i, '.');
100 if (ext && (!stricmp(ext, filespec)))
108 *NumFiles = (int)(j - list);
109 qsort(list, *NumFiles, sizeof(char *), (int (*)( const void *, const void * ))file_sort_func);
114 int ui_get_filename( char * filename, char * Filespec, char * message )
116 char ViewDir[PATH_MAX];
117 char InputText[PATH_MAX];
119 PHYSFS_file *TempFile;
120 int NumFiles, NumDirs,i;
121 char **filename_list;
122 char **directory_list;
125 UI_GADGET_BUTTON *Button1, *Button2, *HelpButton;
126 UI_GADGET_LISTBOX *ListBox1;
127 UI_GADGET_LISTBOX *ListBox2;
128 UI_GADGET_INPUTBOX *UserFile;
131 if ((p = strrchr(filename, '/')))
134 strcpy(ViewDir, filename);
135 strcpy(InputText, p);
140 strcpy(InputText, filename);
143 filename_list = file_getfilelist(&NumFiles, Filespec, ViewDir);
144 directory_list = file_getdirlist(&NumDirs, ViewDir);
146 // Running out of memory may become likely in the future
147 if (!filename_list && !directory_list)
152 PHYSFS_freeList(directory_list);
158 PHYSFS_freeList(filename_list);
162 //ui_messagebox( -2,-2, 1,"DEBUG:0", "Ok" );
167 wnd = ui_open_window( 200, 100, 400, 370, WIN_DIALOG );
169 ui_wprintf_at( wnd, 10, 5, message );
171 ui_wprintf_at( wnd, 20, 32,"N&ame" );
172 UserFile = ui_add_gadget_inputbox( wnd, 60, 30, PATH_MAX, 40, InputText );
174 ui_wprintf_at( wnd, 20, 86,"&Files" );
175 ui_wprintf_at( wnd, 210, 86,"&Dirs" );
177 ListBox1 = ui_add_gadget_listbox(wnd, 20, 110, 125, 200, NumFiles, filename_list);
178 ListBox2 = ui_add_gadget_listbox(wnd, 210, 110, 100, 200, NumDirs, directory_list);
180 Button1 = ui_add_gadget_button( wnd, 20, 330, 60, 25, "Ok", NULL );
181 Button2 = ui_add_gadget_button( wnd, 100, 330, 60, 25, "Cancel", NULL );
182 HelpButton = ui_add_gadget_button( wnd, 180, 330, 60, 25, "Help", NULL );
184 wnd->keyboard_focus_gadget = (UI_GADGET *)UserFile;
186 Button1->hotkey = KEY_CTRLED + KEY_ENTER;
187 Button2->hotkey = KEY_ESC;
188 HelpButton->hotkey = KEY_F1;
189 ListBox1->hotkey = KEY_ALTED + KEY_F;
190 ListBox2->hotkey = KEY_ALTED + KEY_D;
191 UserFile->hotkey = KEY_ALTED + KEY_A;
193 ui_gadget_calc_keys(wnd);
195 ui_wprintf_at( wnd, 20, 60, "%s", Spaces );
196 ui_wprintf_at( wnd, 20, 60, "%s", ViewDir );
203 ui_window_do_gadgets(wnd);
205 if ( Button2->pressed )
207 PHYSFS_freeList(filename_list);
208 PHYSFS_freeList(directory_list);
209 ui_close_window(wnd);
213 if ( HelpButton->pressed )
214 ui_messagebox( -1, -1, 1, "Sorry, no help is available!", "Ok" );
216 if (ListBox1->moved || new_listboxes)
218 if (ListBox1->current_item >= 0 )
219 ui_inputbox_set_text(UserFile, filename_list[ListBox1->current_item]);
222 if (ListBox2->moved || new_listboxes)
224 if (ListBox2->current_item >= 0 )
225 ui_inputbox_set_text(UserFile, directory_list[ListBox2->current_item]);
229 if (Button1->pressed || UserFile->pressed || (ListBox1->selected_item > -1 ) || (ListBox2->selected_item > -1 ))
233 if (ListBox2->selected_item > -1 )
234 strcpy(UserFile->text, directory_list[ListBox2->selected_item]);
236 strncpy(filename, ViewDir, PATH_MAX);
239 while (!strncmp(p, "..", 2)) // shorten the path manually
241 char *sep = strrchr(filename, '/');
245 *filename = 0; // look directly in search paths
253 strncat(filename, "/", PATH_MAX - strlen(filename));
254 strncat(filename, p, PATH_MAX - strlen(filename));
256 if (!PHYSFS_isDirectory(filename))
258 TempFile = PHYSFS_openRead(filename);
261 // Looks like a valid filename that already exists!
262 PHYSFS_close(TempFile);
266 // File doesn't exist, but can we create it?
267 TempFile = PHYSFS_openWrite(filename);
270 // Looks like a valid filename!
271 PHYSFS_close(TempFile);
272 PHYSFS_delete(filename);
278 if (filename[strlen(filename) - 1] == '/') // user typed a separator on the end
279 filename[strlen(filename) - 1] = 0;
281 strcpy(ViewDir, filename);
283 //mprintf( 0, "----------------------------\n" );
284 //mprintf( 0, "Full dir: '%s'\n", ViewDir );
286 PHYSFS_freeList(filename_list);
287 filename_list = file_getfilelist(&NumFiles, Filespec, ViewDir);
290 PHYSFS_freeList(directory_list);
294 ui_inputbox_set_text(UserFile, Filespec);
296 PHYSFS_freeList(directory_list);
297 directory_list = file_getdirlist(&NumDirs, ViewDir);
300 PHYSFS_freeList(filename_list);
304 ui_listbox_change(wnd, ListBox1, NumFiles, filename_list);
305 ui_listbox_change(wnd, ListBox2, NumDirs, directory_list);
308 ui_wprintf_at( wnd, 20, 60, "%s", Spaces );
309 ui_wprintf_at( wnd, 20, 60, "%s", ViewDir );
312 //while ( TICKER < i+2 );
325 ui_close_window(wnd);
327 PHYSFS_freeList(filename_list);
329 PHYSFS_freeList(directory_list);
336 int ui_get_file( char * filename, char * Filespec )
339 char **list = file_getfilelist(&NumFiles, Filespec, "");
343 x = MenuX(-1, -1, NumFiles, list);
346 strcpy(filename, list[x - 1]);
348 PHYSFS_freeList(list);