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.
29 int file_sort_func(char **e0, char **e1)
31 return stricmp(*e0, *e1);
35 char **file_getdirlist(int *NumDirs, char *dir)
38 char **list = PHYSFS_enumerateFiles(dir);
48 strncat(path, "/", PATH_MAX - strlen(dir));
50 test_filename = path + strlen(path);
51 test_max = PATH_MAX - (test_filename - path);
53 for (i = list; *i; i++)
55 if (strlen(*i) >= test_max)
58 strcpy(test_filename, *i);
59 if (PHYSFS_isDirectory(path))
67 qsort(list, *NumDirs, sizeof(char *), (int (*)( const void *, const void * ))file_sort_func);
71 // Put the 'go to parent directory' sequence '..' first
73 list = realloc(list, sizeof(char *)*(*NumDirs + 1));
74 list[*NumDirs] = NULL; // terminate
75 for (i = list + *NumDirs - 1; i != list; i--)
77 list[0] = strdup("..");
83 char **file_getfilelist(int *NumFiles, char *filespec, char *dir)
85 char **list = PHYSFS_enumerateFiles(dir);
86 char **i, **j = list, *ext;
94 for (i = list; *i; i++)
96 ext = strrchr(*i, '.');
97 if (ext && (!stricmp(ext, filespec)))
105 *NumFiles = j - list;
106 qsort(list, *NumFiles, sizeof(char *), (int (*)( const void *, const void * ))file_sort_func);
111 int ui_get_filename( char * filename, char * Filespec, char * message )
113 char ViewDir[PATH_MAX];
114 char InputText[PATH_MAX];
116 PHYSFS_file *TempFile;
117 int NumFiles, NumDirs,i;
118 char **filename_list;
119 char **directory_list;
122 UI_GADGET_BUTTON *Button1, *Button2, *HelpButton;
123 UI_GADGET_LISTBOX *ListBox1;
124 UI_GADGET_LISTBOX *ListBox2;
125 UI_GADGET_INPUTBOX *UserFile;
128 if ((p = strrchr(filename, '/')))
131 strcpy(ViewDir, filename);
132 strcpy(InputText, p);
137 strcpy(InputText, filename);
140 filename_list = file_getfilelist(&NumFiles, Filespec, ViewDir);
141 directory_list = file_getdirlist(&NumDirs, ViewDir);
143 // Running out of memory may become likely in the future
144 if (!filename_list && !directory_list)
149 PHYSFS_freeList(directory_list);
155 PHYSFS_freeList(filename_list);
159 //MessageBox( -2,-2, 1,"DEBUG:0", "Ok" );
164 wnd = ui_open_window( 200, 100, 400, 370, WIN_DIALOG );
166 ui_wprintf_at( wnd, 10, 5, message );
168 ui_wprintf_at( wnd, 20, 32,"N&ame" );
169 UserFile = ui_add_gadget_inputbox( wnd, 60, 30, PATH_MAX, 40, InputText );
171 ui_wprintf_at( wnd, 20, 86,"&Files" );
172 ui_wprintf_at( wnd, 210, 86,"&Dirs" );
174 ListBox1 = ui_add_gadget_listbox(wnd, 20, 110, 125, 200, NumFiles, filename_list);
175 ListBox2 = ui_add_gadget_listbox(wnd, 210, 110, 100, 200, NumDirs, directory_list);
177 Button1 = ui_add_gadget_button( wnd, 20, 330, 60, 25, "Ok", NULL );
178 Button2 = ui_add_gadget_button( wnd, 100, 330, 60, 25, "Cancel", NULL );
179 HelpButton = ui_add_gadget_button( wnd, 180, 330, 60, 25, "Help", NULL );
181 wnd->keyboard_focus_gadget = (UI_GADGET *)UserFile;
183 Button1->hotkey = KEY_CTRLED + KEY_ENTER;
184 Button2->hotkey = KEY_ESC;
185 HelpButton->hotkey = KEY_F1;
186 ListBox1->hotkey = KEY_ALTED + KEY_F;
187 ListBox2->hotkey = KEY_ALTED + KEY_D;
188 UserFile->hotkey = KEY_ALTED + KEY_A;
190 ui_gadget_calc_keys(wnd);
192 ui_wprintf_at( wnd, 20, 60, "%s", Spaces );
193 ui_wprintf_at( wnd, 20, 60, "%s", ViewDir );
200 ui_window_do_gadgets(wnd);
202 if ( Button2->pressed )
204 PHYSFS_freeList(filename_list);
205 PHYSFS_freeList(directory_list);
206 ui_close_window(wnd);
210 if ( HelpButton->pressed )
211 MessageBox( -1, -1, 1, "Sorry, no help is available!", "Ok" );
213 if (ListBox1->moved || new_listboxes)
215 if (ListBox1->current_item >= 0 )
216 ui_inputbox_set_text(UserFile, filename_list[ListBox1->current_item]);
219 if (ListBox2->moved || new_listboxes)
221 if (ListBox2->current_item >= 0 )
222 ui_inputbox_set_text(UserFile, directory_list[ListBox2->current_item]);
226 if (Button1->pressed || UserFile->pressed || (ListBox1->selected_item > -1 ) || (ListBox2->selected_item > -1 ))
230 if (ListBox2->selected_item > -1 )
231 strcpy(UserFile->text, directory_list[ListBox2->selected_item]);
233 strncpy(filename, ViewDir, PATH_MAX);
236 while (!strncmp(p, "..", 2)) // shorten the path manually
238 char *sep = strrchr(filename, '/');
242 *filename = 0; // look directly in search paths
250 strncat(filename, "/", PATH_MAX - strlen(filename));
251 strncat(filename, p, PATH_MAX - strlen(filename));
253 if (!PHYSFS_isDirectory(filename))
255 TempFile = PHYSFS_openRead(filename);
258 // Looks like a valid filename that already exists!
259 PHYSFS_close(TempFile);
263 // File doesn't exist, but can we create it?
264 TempFile = PHYSFS_openWrite(filename);
267 // Looks like a valid filename!
268 PHYSFS_close(TempFile);
269 PHYSFS_delete(filename);
275 if (filename[strlen(filename) - 1] == '/') // user typed a separator on the end
276 filename[strlen(filename) - 1] = 0;
278 strcpy(ViewDir, filename);
280 //mprintf( 0, "----------------------------\n" );
281 //mprintf( 0, "Full dir: '%s'\n", ViewDir );
283 PHYSFS_freeList(filename_list);
284 filename_list = file_getfilelist(&NumFiles, Filespec, ViewDir);
287 PHYSFS_freeList(directory_list);
291 ui_inputbox_set_text(UserFile, Filespec);
293 PHYSFS_freeList(directory_list);
294 directory_list = file_getdirlist(&NumDirs, ViewDir);
297 PHYSFS_freeList(filename_list);
301 ui_listbox_change(wnd, ListBox1, NumFiles, filename_list);
302 ui_listbox_change(wnd, ListBox2, NumDirs, directory_list);
305 ui_wprintf_at( wnd, 20, 60, "%s", Spaces );
306 ui_wprintf_at( wnd, 20, 60, "%s", ViewDir );
309 //while ( TICKER < i+2 );
322 ui_close_window(wnd);
324 PHYSFS_freeList(filename_list);
326 PHYSFS_freeList(directory_list);
333 int ui_get_file( char * filename, char * Filespec )
336 char **list = file_getfilelist(&NumFiles, Filespec, "");
340 x = MenuX(-1, -1, NumFiles, list);
343 strcpy(filename, list[x - 1]);
345 PHYSFS_freeList(list);