comparison os2/dw.c @ 485:469ff8133ed3

Simplified the folder browser on OS/2, following some Unix changes.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Thu, 16 Oct 2003 08:12:01 +0000
parents ea099ba917c6
children d6e07d292145
comparison
equal deleted inserted replaced
484:f18c70cb3e38 485:469ff8133ed3
8074 env->DWMinorVersion = DW_MINOR_VERSION; 8074 env->DWMinorVersion = DW_MINOR_VERSION;
8075 env->DWSubVersion = DW_SUB_VERSION; 8075 env->DWSubVersion = DW_SUB_VERSION;
8076 } 8076 }
8077 8077
8078 /* The next few functions are support functions for the OS/2 folder browser */ 8078 /* The next few functions are support functions for the OS/2 folder browser */
8079 void _populate_directory(HMTX mtx, HWND *tree, HTREEITEM parent, char *path) 8079 void _populate_directory(HWND tree, HTREEITEM parent, char *path)
8080 { 8080 {
8081 FILEFINDBUF3 ffbuf; 8081 FILEFINDBUF3 ffbuf;
8082 HTREEITEM item; 8082 HTREEITEM item;
8083 ULONG count = 1; 8083 ULONG count = 1;
8084 HDIR hdir = HDIR_CREATE; 8084 HDIR hdir = HDIR_CREATE;
8085 8085
8086 dw_mutex_lock(mtx); 8086 if(DosFindFirst(path, &hdir, FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_ARCHIVED | MUST_HAVE_DIRECTORY,
8087 if(*tree) 8087 &ffbuf, sizeof(FILEFINDBUF3), &count, FIL_STANDARD) == NO_ERROR)
8088 { 8088 {
8089 if(DosFindFirst(path, &hdir, FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM | FILE_ARCHIVED | MUST_HAVE_DIRECTORY, 8089 while(DosFindNext(hdir, &ffbuf, sizeof(FILEFINDBUF3), &count) == NO_ERROR)
8090 &ffbuf, sizeof(FILEFINDBUF3), &count, FIL_STANDARD) == NO_ERROR) 8090 {
8091 { 8091 if(strcmp(ffbuf.achName, ".") && strcmp(ffbuf.achName, ".."))
8092 while(DosFindNext(hdir, &ffbuf, sizeof(FILEFINDBUF3), &count) == NO_ERROR)
8093 { 8092 {
8094 if(strcmp(ffbuf.achName, ".") && strcmp(ffbuf.achName, "..")) 8093 int len = strlen(path);
8095 { 8094 char *folder = malloc(len + ffbuf.cchName + 2);
8096 int len = strlen(path); 8095 HTREEITEM tempitem;
8097 char *folder = malloc(len + ffbuf.cchName + 2); 8096
8098 HTREEITEM tempitem; 8097 strcpy(folder, path);
8099 8098 strcpy(&folder[len-1], ffbuf.achName);
8100 strcpy(folder, path); 8099
8101 strcpy(&folder[len-1], ffbuf.achName); 8100 item = dw_tree_insert(tree, ffbuf.achName, WinLoadFileIcon(folder, TRUE), parent, (void *)parent);
8102 8101 tempitem = dw_tree_insert(tree, "", 0, item, 0);
8103 item = dw_tree_insert(*tree, ffbuf.achName, WinLoadFileIcon(folder, TRUE), parent, (void *)parent); 8102 dw_tree_set_data(tree, item, (void *)tempitem);
8104 tempitem = dw_tree_insert(*tree, "", 0, item, 0);
8105 dw_tree_set_data(*tree, item, (void *)tempitem);
8106
8107 dw_mutex_unlock(mtx);
8108 strcat(folder, "\\*");
8109
8110 free(folder);
8111 dw_mutex_lock(mtx);
8112 if(!*tree)
8113 {
8114 dw_mutex_unlock(mtx);
8115 DosFindClose(hdir);
8116 return;
8117 }
8118 }
8119 } 8103 }
8120 DosFindClose(hdir); 8104 }
8121 } 8105 DosFindClose(hdir);
8122 } 8106 }
8123 dw_mutex_unlock(mtx);
8124 } 8107 }
8125 8108
8126 void _populate_tree_thread(void *data) 8109 void _populate_tree_thread(void *data)
8127 { 8110 {
8128 HWND window = (HWND)data, *tree = (HWND *)dw_window_get_data(window, "_dw_tree"); 8111 HWND window = (HWND)data, tree = (HWND)dw_window_get_data(window, "_dw_tree");
8129 HMTX mtx = (HMTX)dw_window_get_data(window, "_dw_mutex"); 8112 HMTX mtx = (HMTX)dw_window_get_data(window, "_dw_mutex");
8130 int drive; 8113 int drive;
8131 HTREEITEM items[26]; 8114 HTREEITEM items[26];
8132 FSINFO volinfo; 8115 FSINFO volinfo;
8133 8116
8134 DosError(FERR_DISABLEHARDERR); 8117 DosError(FERR_DISABLEHARDERR);
8135 8118
8119 dw_mutex_lock(mtx);
8136 for(drive=0;drive<26;drive++) 8120 for(drive=0;drive<26;drive++)
8137 { 8121 {
8138 if(DosQueryFSInfo(drive+1, FSIL_VOLSER,(PVOID)&volinfo, sizeof(FSINFO)) == NO_ERROR) 8122 if(DosQueryFSInfo(drive+1, FSIL_VOLSER,(PVOID)&volinfo, sizeof(FSINFO)) == NO_ERROR)
8139 { 8123 {
8140 char folder[5] = "C:\\", name[9] = "Drive C:"; 8124 char folder[5] = "C:\\", name[9] = "Drive C:";
8141 HTREEITEM tempitem; 8125 HTREEITEM tempitem;
8142 8126
8143 folder[0] = name[6] = 'A' + drive; 8127 folder[0] = name[6] = 'A' + drive;
8144 8128
8145 dw_mutex_lock(mtx); 8129 items[drive] = dw_tree_insert(tree, name, WinLoadFileIcon(folder, TRUE), NULL, 0);
8146 if(!*tree) 8130 tempitem = dw_tree_insert(tree, "", 0, items[drive], 0);
8147 { 8131 dw_tree_set_data(tree, items[drive], (void *)tempitem);
8148 free(tree);
8149 dw_mutex_close(mtx);
8150 return;
8151 }
8152
8153 items[drive] = dw_tree_insert(*tree, name, WinLoadFileIcon(folder, TRUE), NULL, 0);
8154 tempitem = dw_tree_insert(*tree, "", 0, items[drive], 0);
8155 dw_tree_set_data(*tree, items[drive], (void *)tempitem);
8156
8157 dw_mutex_unlock(mtx);
8158 } 8132 }
8159 else 8133 else
8160 items[drive] = 0; 8134 items[drive] = 0;
8161 } 8135 }
8136 dw_mutex_unlock(mtx);
8137
8162 DosError(FERR_ENABLEHARDERR); 8138 DosError(FERR_ENABLEHARDERR);
8163
8164 dw_mutex_lock(mtx);
8165 if(!*tree)
8166 {
8167 free(tree);
8168 dw_mutex_close(mtx);
8169 }
8170 } 8139 }
8171 8140
8172 int DWSIGNAL _dw_ok_func(HWND window, void *data) 8141 int DWSIGNAL _dw_ok_func(HWND window, void *data)
8173 { 8142 {
8174 DWDialog *dwwait = (DWDialog *)data; 8143 DWDialog *dwwait = (DWDialog *)data;
8175 HMTX mtx = (HMTX)dw_window_get_data(window, "_dw_mutex"); 8144 HMTX mtx = (HMTX)dw_window_get_data((HWND)dwwait->data, "_dw_mutex");
8176 void *treedata; 8145 void *treedata;
8177 HWND *tree; 8146
8178 8147 window = window;
8179 if(!dwwait) 8148 if(!dwwait)
8180 return FALSE; 8149 return FALSE;
8181 8150
8182 dw_mutex_lock(mtx); 8151 dw_mutex_lock(mtx);
8183 treedata = dw_window_get_data((HWND)dwwait->data, "_dw_tree_selected"); 8152 treedata = dw_window_get_data((HWND)dwwait->data, "_dw_tree_selected");
8184 if((tree = (HWND *)dw_window_get_data((HWND)dwwait->data, "_dw_tree")) != 0) 8153 dw_mutex_close(mtx);
8185 *tree = 0;
8186 dw_mutex_unlock(mtx);
8187 dw_window_destroy((HWND)dwwait->data); 8154 dw_window_destroy((HWND)dwwait->data);
8188 dw_dialog_dismiss((DWDialog *)data, treedata); 8155 dw_dialog_dismiss((DWDialog *)data, treedata);
8189 return FALSE; 8156 return FALSE;
8190 } 8157 }
8191 8158
8192 int DWSIGNAL _dw_cancel_func(HWND window, void *data) 8159 int DWSIGNAL _dw_cancel_func(HWND window, void *data)
8193 { 8160 {
8194 DWDialog *dwwait = (DWDialog *)data; 8161 DWDialog *dwwait = (DWDialog *)data;
8195 HMTX mtx = (HMTX)dw_window_get_data(window, "_dw_mutex"); 8162 HMTX mtx = (HMTX)dw_window_get_data((HWND)dwwait->data, "_dw_mutex");
8196 HWND *tree; 8163
8197 8164 window = window;
8198 if(!dwwait) 8165 if(!dwwait)
8199 return FALSE; 8166 return FALSE;
8200 8167
8201 dw_mutex_lock(mtx); 8168 dw_mutex_lock(mtx);
8202 if((tree = (HWND *)dw_window_get_data((HWND)dwwait->data, "_dw_tree")) != 0) 8169 dw_mutex_close(mtx);
8203 *tree = 0;
8204 dw_mutex_unlock(mtx);
8205 dw_window_destroy((HWND)dwwait->data); 8170 dw_window_destroy((HWND)dwwait->data);
8206 dw_dialog_dismiss((DWDialog *)data, NULL); 8171 dw_dialog_dismiss((DWDialog *)data, NULL);
8207 return FALSE; 8172 return FALSE;
8208 } 8173 }
8209 8174
8248 return FALSE; 8213 return FALSE;
8249 } 8214 }
8250 8215
8251 int DWSIGNAL _tree_expand(HWND window, HTREEITEM item, void *data) 8216 int DWSIGNAL _tree_expand(HWND window, HTREEITEM item, void *data)
8252 { 8217 {
8253 DWDialog *dwwait = (DWDialog *)data; 8218 HTREEITEM tempitem = (HTREEITEM)dw_tree_get_data(window, item);
8254 HMTX mtx = (HMTX)dw_window_get_data(window, "_dw_mutex"); 8219
8255 HWND *tree = (HWND *)dw_window_get_data((HWND)dwwait->data, "_dw_tree"); 8220 data = data;
8256 HTREEITEM tempitem = (HTREEITEM)dw_tree_get_data(*tree, item);
8257
8258 if(tempitem) 8221 if(tempitem)
8259 { 8222 {
8260 char *folder = _tree_folder(*tree, item); 8223 char *folder = _tree_folder(window, item);
8261 8224
8262 dw_tree_set_data(*tree, item, 0); 8225 dw_tree_set_data(window, item, 0);
8263 dw_tree_delete(*tree, tempitem); 8226 dw_tree_delete(window, tempitem);
8264 8227
8265 if(*folder) 8228 if(*folder)
8266 { 8229 {
8267 strcat(folder, "*"); 8230 strcat(folder, "*");
8268 _populate_directory(mtx, tree, item, folder); 8231 _populate_directory(window, item, folder);
8269 } 8232 }
8270 free(folder); 8233 free(folder);
8271 } 8234 }
8272 8235
8273 return FALSE; 8236 return FALSE;
8287 */ 8250 */
8288 char * API dw_file_browse(char *title, char *defpath, char *ext, int flags) 8251 char * API dw_file_browse(char *title, char *defpath, char *ext, int flags)
8289 { 8252 {
8290 if(flags == DW_DIRECTORY_OPEN) 8253 if(flags == DW_DIRECTORY_OPEN)
8291 { 8254 {
8292 HWND window, hbox, vbox, tree, button, *ptr; 8255 HWND window, hbox, vbox, tree, button;
8293 DWDialog *dwwait; 8256 DWDialog *dwwait;
8294 HMTX mtx = dw_mutex_new(); 8257 HMTX mtx = dw_mutex_new();
8295 8258
8296 window = dw_window_new( HWND_DESKTOP, title, FCF_SHELLPOSITION | FCF_TITLEBAR | FCF_SIZEBORDER | FCF_MINMAX); 8259 window = dw_window_new( HWND_DESKTOP, title, FCF_SHELLPOSITION | FCF_TITLEBAR | FCF_SIZEBORDER | FCF_MINMAX);
8297 8260
8300 dw_box_pack_start(window, vbox, 0, 0, TRUE, TRUE, 0); 8263 dw_box_pack_start(window, vbox, 0, 0, TRUE, TRUE, 0);
8301 8264
8302 tree = dw_tree_new(60); 8265 tree = dw_tree_new(60);
8303 8266
8304 dw_box_pack_start(vbox, tree, 1, 1, TRUE, TRUE, 0); 8267 dw_box_pack_start(vbox, tree, 1, 1, TRUE, TRUE, 0);
8305 ptr = malloc(sizeof(HWND));
8306 *ptr = tree;
8307 dw_window_set_data(window, "_dw_tree", (void *)ptr);
8308 dw_window_set_data(window, "_dw_mutex", (void *)mtx); 8268 dw_window_set_data(window, "_dw_mutex", (void *)mtx);
8269 dw_window_set_data(window, "_dw_tree", (void *)tree);
8309 8270
8310 hbox = dw_box_new(DW_HORZ, 0); 8271 hbox = dw_box_new(DW_HORZ, 0);
8311 8272
8312 dw_box_pack_start(vbox, hbox, 0, 0, TRUE, FALSE, 0); 8273 dw_box_pack_start(vbox, hbox, 0, 0, TRUE, FALSE, 0);
8313 8274