1 /****************************************************************************
3 GLUI User Interface Toolkit
4 ---------------------------
6 glui_filebrowser.cpp - GLUI_FileBrowser control class
9 --------------------------------------------------
11 Copyright (c) 1998 Paul Rademacher
13 This program is freely distributable without licensing fees and is
14 provided without guarantee or warrantee expressed or implied. This
15 program is -not- in the public domain.
17 *****************************************************************************/
20 #include "glui_internal.h"
21 #include <sys/types.h>
34 GLUI_FileBrowser::GLUI_FileBrowser( GLUI_Node *parent,
47 parent->add_control( this );
48 list = new GLUI_List(this, true, 1);
49 list->set_object_callback( GLUI_FileBrowser::dir_list_callback, this );
50 list->set_click_type(GLUI_DOUBLE_CLICK);
51 this->fbreaddir(this->current_dir.c_str());
54 /****************************** GLUI_FileBrowser::draw() **********/
56 void GLUI_FileBrowser::dir_list_callback(GLUI_Control *glui_object) {
57 GLUI_List *list = glui_object->dynamicCastGLUI_List();
60 GLUI_FileBrowser* me = list->associated_object->dynamicCastGLUI_FileBrowser();
65 this_item = list->get_current_item();
66 if (this_item > 0) { /* file or directory selected */
67 selected = list->get_item_ptr( this_item )->text.c_str();
68 if (selected[0] == '/' || selected[0] == '\\') {
69 if (me->allow_change_dir) {
74 SetCurrentDirectory(selected+1);
80 me->execute_callback();
87 void GLUI_FileBrowser::fbreaddir(const char *d) {
98 //char search_arg[MAX_PATH], new_file_path[MAX_PATH];
99 //sprintf(search_arg, "%s\\*.*", path_name);
101 hFind = FindFirstFile("*.*", &FN);
104 if (hFind != INVALID_HANDLE_VALUE) {
106 int len = int(strlen(FN.cFileName));
107 if (FN.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
109 item += FN.cFileName;
113 list->add_item(i,item.c_str());
115 } while (FindNextFile(hFind, &FN) != 0);
117 if (GetLastError() == ERROR_NO_MORE_FILES)
124 #elif defined(__GNUC__)
132 if ((dir = opendir(d)) == NULL)
133 perror("fbreaddir:");
135 while ((dirp = readdir(dir)) != NULL) /* open directory */
137 if (!lstat(dirp->d_name,&dr) && S_ISDIR(dr.st_mode)) /* dir is directory */
138 item = dirp->d_name + GLUI_String("/");
142 list->add_item(i,item.c_str());
151 void ProcessFiles(const char *path_name)
157 void GLUI_FileBrowser::set_w(int w)
159 if (list) list->set_w(w);
162 void GLUI_FileBrowser::set_h(int h)
164 if (list) list->set_h(h);