Mercurial > dwindows
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 |