Changeset 551 for trunk/dll/dircnrs.c
- Timestamp:
- Feb 28, 2007, 2:33:51 AM (19 years ago)
- File:
-
- 1 edited
-
trunk/dll/dircnrs.c (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/dll/dircnrs.c
r449 r551 48 48 static PSZ pszSrcFile = __FILE__; 49 49 50 MRESULT EXPENTRY DirFrameWndProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)50 MRESULT EXPENTRY DirFrameWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) 51 51 { 52 return CommonFrameWndProc(DIR_CNR, hwnd,msg,mp1,mp2);52 return CommonFrameWndProc(DIR_CNR, hwnd, msg, mp1, mp2); 53 53 } 54 54 55 56 MRESULT EXPENTRY DirTextProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2) 55 MRESULT EXPENTRY DirTextProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) 57 56 { 58 static BOOL emphasized = FALSE; 59 static HWND hwndButtonPopup = (HWND)0; 60 static USHORT lastid = 0; 61 static ULONG timestamp = ULONG_MAX; 62 63 switch(msg) { 64 case WM_CREATE: 65 return CommonTextProc(hwnd,msg,mp1,mp2); 66 67 case WM_COMMAND: 57 static BOOL emphasized = FALSE; 58 static HWND hwndButtonPopup = (HWND) 0; 59 static USHORT lastid = 0; 60 static ULONG timestamp = ULONG_MAX; 61 62 switch (msg) { 63 case WM_CREATE: 64 return CommonTextProc(hwnd, msg, mp1, mp2); 65 66 case WM_COMMAND: 67 { 68 DIRCNRDATA *dcd; 69 MRESULT mr; 70 71 mr = WinSendMsg(WinWindowFromID(WinQueryWindow(hwnd, 72 QW_PARENT), 73 DIR_CNR), msg, mp1, mp2); 74 if (hwndButtonPopup && 75 SHORT1FROMMP(mp1) > IDM_DETAILSTITLES && 76 SHORT1FROMMP(mp1) < IDM_DETAILSSETUP) { 77 dcd = WinQueryWindowPtr(WinWindowFromID(WinQueryWindow(hwnd, 78 QW_PARENT), 79 DIR_CNR), QWL_USER); 80 if (dcd) 81 SetDetailsSwitches(hwndButtonPopup, dcd); 82 } 83 return mr; 84 } 85 86 case UM_CONTEXTMENU: 87 case WM_CONTEXTMENU: 88 { 89 USHORT id; 90 91 id = WinQueryWindowUShort(hwnd, QWS_ID); 92 switch (id) { 93 case DIR_FOLDERICON: 94 if (fNoFoldMenu) { 95 PostMsg(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT), 96 DIR_CNR), 97 WM_COMMAND, MPFROM2SHORT(IDM_PREVIOUS, 0), mp2); 98 break; 99 } 100 /* else intentional fallthru */ 101 case DIR_SELECTED: 102 case DIR_VIEW: 103 case DIR_SORT: 104 { 105 POINTL ptl = { 0, 0 }; 106 SWP swp; 107 DIRCNRDATA *dcd; 108 109 if (hwndButtonPopup) 110 WinDestroyWindow(hwndButtonPopup); 111 if (id == DIR_SELECTED && msg == WM_CONTEXTMENU) 112 id = DIR_MAX; 113 if (id == lastid) { 114 115 ULONG check; 116 117 DosQuerySysInfo(QSV_MS_COUNT, 118 QSV_MS_COUNT, &check, sizeof(check)); 119 if (check < timestamp + 500) { 120 lastid = 0; 121 goto MenuAbort; 122 } 123 } 124 hwndButtonPopup = WinLoadMenu(HWND_DESKTOP, FM3ModHandle, id); 125 if (hwndButtonPopup) { 126 WinSetWindowUShort(hwndButtonPopup, QWS_ID, id); 127 dcd = WinQueryWindowPtr(WinWindowFromID(WinQueryWindow(hwnd, 128 QW_PARENT), 129 DIR_CNR), QWL_USER); 130 if (id == DIR_SORT) { /* don't have sort pathname in dirs */ 131 WinSendMsg(hwndButtonPopup, 132 MM_DELETEITEM, 133 MPFROM2SHORT(IDM_SORTNAME, FALSE), MPVOID); 134 WinSendMsg(hwndButtonPopup, 135 MM_DELETEITEM, 136 MPFROM2SHORT(IDM_SORTNONE, FALSE), MPVOID); 137 if (dcd) 138 SetSortChecks(hwndButtonPopup, dcd->sortFlags); 139 } 140 else if (id == DIR_VIEW) { 141 if (dcd) { 142 SetViewMenu(hwndButtonPopup, dcd->flWindowAttr); 143 SetDetailsSwitches(hwndButtonPopup, dcd); 144 } 145 } 146 else if (id == DIR_MAX) { 147 148 int x; 149 BOOL enable; 150 USHORT ids[] = { IDM_SELECTBOTH, 151 IDM_SELECTMORE, 152 IDM_SELECTONE, 153 IDM_SELECTNEWER, 154 IDM_SELECTOLDER, 155 IDM_SELECTBIGGER, 156 IDM_SELECTSMALLER, 157 IDM_DESELECTBOTH, 158 IDM_DESELECTMORE, 159 IDM_DESELECTONE, 160 IDM_DESELECTNEWER, 161 IDM_DESELECTOLDER, 162 IDM_DESELECTBIGGER, 163 IDM_DESELECTSMALLER, 164 0 165 }; 166 167 enable = (CountDirCnrs(dcd->hwndParent) > 1); 168 for (x = 0; ids[x]; x++) 169 WinEnableMenuItem(hwndButtonPopup, ids[x], enable); 170 } 171 else if (id == DIR_SELECTED) { 172 if (dcd) 173 WinEnableMenuItem(hwndButtonPopup, 174 IDM_RESELECT, (dcd->lastselection != NULL)); 175 } 176 ptl.x = 0; 177 if (WinPopupMenu(HWND_OBJECT, 178 HWND_OBJECT, 179 hwndButtonPopup, -32767, -32767, 0, 0)) { 180 WinQueryWindowPos(hwndButtonPopup, &swp); 181 ptl.y = -(swp.cy + 2); 182 } 183 else { 184 WinQueryWindowPos(hwnd, &swp); 185 ptl.y = swp.cy + 2; 186 } 187 if (WinPopupMenu(hwnd, 188 hwnd, 189 hwndButtonPopup, 190 ptl.x, 191 ptl.y, 192 0, 193 PU_HCONSTRAIN | PU_VCONSTRAIN | 194 PU_KEYBOARD | PU_MOUSEBUTTON1)) { 195 CenterOverWindow(hwndButtonPopup); 196 PaintRecessedWindow(hwnd, (HPS) 0, FALSE, FALSE); 197 } 198 } 199 } 200 break; 201 default: 202 PostMsg(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT), DIR_CNR), 203 WM_CONTROL, MPFROM2SHORT(DIR_CNR, CN_CONTEXTMENU), MPVOID); 204 break; 205 } 206 } // case WM_CONTENT_MENU 207 208 MenuAbort: 209 210 if (msg == UM_CONTEXTMENU) 211 return 0; 212 break; 213 214 case WM_MENUEND: 215 if (hwndButtonPopup == (HWND) mp2) { 216 lastid = WinQueryWindowUShort((HWND) mp2, QWS_ID); 217 WinDestroyWindow(hwndButtonPopup); 218 hwndButtonPopup = (HWND) 0; 219 DosQuerySysInfo(QSV_MS_COUNT, 220 QSV_MS_COUNT, ×tamp, sizeof(timestamp)); 221 switch (lastid) { 222 case DIR_VIEW: 223 case DIR_SORT: 224 case DIR_FOLDERICON: 225 case DIR_SELECTED: 226 case DIR_MAX: 227 PaintRecessedWindow(hwnd, (HPS) 0, TRUE, FALSE); 228 break; 229 } 230 } 231 break; 232 233 case WM_BUTTON3DOWN: 234 case WM_BUTTON1DOWN: 235 case WM_BUTTON3UP: 236 case WM_BUTTON1UP: 237 { 238 USHORT id; 239 240 id = WinQueryWindowUShort(hwnd, QWS_ID); 241 switch (id) { 242 case DIR_FILTER: 243 case DIR_VIEW: 244 case DIR_SORT: 245 case DIR_SELECTED: 246 case DIR_FOLDERICON: 247 case DIR_MAX: 248 return CommonTextButton(hwnd, msg, mp1, mp2); 249 } 250 } 251 break; 252 253 case WM_BUTTON1DBLCLK: 254 { 255 NOTIFYRECORDENTER nr; 256 257 memset(&nr, 0, sizeof(NOTIFYRECORDENTER)); 258 nr.hwndCnr = WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT), DIR_CNR); 259 WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), 260 WM_CONTROL, MPFROM2SHORT(DIR_CNR, CN_ENTER), MPFROMP(&nr)); 261 } 262 break; 263 264 case WM_MOUSEMOVE: 265 { 266 USHORT id = WinQueryWindowUShort(hwnd, QWS_ID); 267 char *s = NULL; 268 269 if (fOtherHelp) { 270 if ((!hwndBubble || 271 WinQueryWindowULong(hwndBubble, QWL_USER) != hwnd) && 272 !WinQueryCapture(HWND_DESKTOP)) { 273 switch (id) { 274 case DIR_TOTALS: 275 s = GetPString(IDS_DIRCNRTOTALHELP); 276 break; 277 case DIR_SELECTED: 278 s = GetPString(IDS_DIRCNRSELECTEDHELP); 279 break; 280 case DIR_VIEW: 281 s = GetPString(IDS_DIRCNRVIEWHELP); 282 break; 283 case DIR_SORT: 284 s = GetPString(IDS_DIRCNRSORTHELP); 285 break; 286 case DIR_FILTER: 287 s = GetPString(IDS_DIRCNRFILTERHELP); 288 break; 289 case DIR_MAX: 290 s = GetPString(IDS_DIRCNRMAXHELP); 291 break; 292 case DIR_FOLDERICON: 293 s = GetPString(IDS_DIRCNRFOLDERHELP); 294 break; 295 default: 296 break; 297 } 298 if (s) 299 MakeBubble(hwnd, TRUE, s); 300 else if (hwndBubble) 301 WinDestroyWindow(hwndBubble); 302 } 303 } 304 switch (id) { 305 case DIR_MAX: 306 case DIR_FOLDERICON: 307 case DIR_FILTER: 308 case DIR_SORT: 309 case DIR_VIEW: 310 case DIR_SELECTED: 311 return CommonTextButton(hwnd, msg, mp1, mp2); 312 } 313 } 314 break; 315 316 case WM_CHORD: 317 case WM_BUTTON3CLICK: 318 case WM_BUTTON1CLICK: 319 case UM_CLICKED: 320 case UM_CLICKED3: 321 { 322 USHORT id, cmd = 0; 323 324 id = WinQueryWindowUShort(hwnd, QWS_ID); 325 if (msg == UM_CLICKED || msg == UM_CLICKED3) { 326 switch (id) { 327 case DIR_MAX: 328 cmd = IDM_MAXIMIZE; 329 break; 330 case DIR_VIEW: 331 case DIR_SELECTED: 332 case DIR_SORT: 333 PostMsg(hwnd, UM_CONTEXTMENU, MPVOID, MPVOID); 334 break; 335 case DIR_FILTER: 336 cmd = IDM_FILTER; 337 break; 338 default: 339 break; 340 } 341 } 342 else if (id == DIR_FOLDERICON) { 343 if ((msg == WM_BUTTON1CLICK && (SHORT2FROMMP(mp2) & KC_CTRL))) 344 cmd = IDM_PREVIOUS; 345 else if (msg == WM_BUTTON3CLICK || msg == WM_CHORD) 346 cmd = IDM_RESCAN; 347 else if (msg == WM_BUTTON1CLICK && (SHORT2FROMMP(mp2) & KC_SHIFT)) 348 cmd = IDM_WALKDIR; 349 else if (msg == WM_BUTTON1CLICK && (SHORT2FROMMP(mp2) & KC_ALT)) 350 cmd = IDM_WINDOWDLG; 351 else 352 cmd = IDM_PARENT; 353 } 354 if (cmd) 355 PostMsg(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT), 356 DIR_CNR), 357 WM_COMMAND, MPFROM2SHORT(cmd, 0), MPVOID); 358 } 359 if (msg == UM_CLICKED || msg == UM_CLICKED3) 360 return 0; 361 break; 362 363 case DM_DROP: 364 case DM_DRAGOVER: 365 case DM_DRAGLEAVE: 366 case DM_DROPHELP: 367 case WM_BEGINDRAG: 368 if (msg == DM_DRAGOVER) { 369 if (!emphasized) { 370 emphasized = TRUE; 371 DrawTargetEmphasis(hwnd, emphasized); 372 } 373 } 374 else if (msg != WM_BEGINDRAG) { 375 if (emphasized) { 376 emphasized = FALSE; 377 DrawTargetEmphasis(hwnd, emphasized); 378 } 379 } 380 switch (WinQueryWindowUShort(hwnd, QWS_ID)) { 381 case DIR_FOLDERICON: 382 switch (msg) { 383 case DM_DRAGOVER: 384 if (AcceptOneDrop(mp1, mp2)) 385 return MRFROM2SHORT(DOR_DROP, DO_MOVE); 386 return (MRFROM2SHORT(DOR_NODROP, 0)); /* Drop not valid */ 387 case DM_DROPHELP: 388 DropHelp(mp1, mp2, hwnd, GetPString(IDS_DIRCNRFOLDERDROPHELP)); 389 return 0; 390 case DM_DROP: 391 { 392 char szFrom[CCHMAXPATH + 2]; 393 394 if (emphasized) { 395 emphasized = FALSE; 396 DrawTargetEmphasis(hwnd, emphasized); 397 } 398 if (GetOneDrop(mp1, mp2, szFrom, sizeof(szFrom))) 399 WinSendMsg(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT), 400 DIR_CNR), 401 WM_COMMAND, MPFROM2SHORT(IDM_SWITCH, 0), 402 MPFROMP(szFrom)); 403 } 404 return 0; 405 default: 406 return PFNWPStatic(hwnd, msg, mp1, mp2); 407 } 408 case DIR_MAX: 409 if (msg == WM_BEGINDRAG) 410 return PFNWPStatic(hwnd, msg, mp1, mp2); 411 default: 68 412 { 69 DIRCNRDATA *dcd; 70 MRESULT mr; 71 72 mr = WinSendMsg(WinWindowFromID(WinQueryWindow(hwnd, 73 QW_PARENT), 74 DIR_CNR), 75 msg, 76 mp1, 77 mp2); 78 if(hwndButtonPopup && 79 SHORT1FROMMP(mp1) > IDM_DETAILSTITLES && 80 SHORT1FROMMP(mp1) < IDM_DETAILSSETUP) { 81 dcd = WinQueryWindowPtr(WinWindowFromID(WinQueryWindow(hwnd, 82 QW_PARENT), 83 DIR_CNR), 84 QWL_USER); 85 if(dcd) 86 SetDetailsSwitches(hwndButtonPopup, 87 dcd); 88 } 89 return mr; 90 } 91 92 case UM_CONTEXTMENU: 93 case WM_CONTEXTMENU: 94 { 95 USHORT id; 96 97 id = WinQueryWindowUShort(hwnd,QWS_ID); 98 switch(id) { 99 case DIR_FOLDERICON: 100 if(fNoFoldMenu) { 101 PostMsg(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT), 102 DIR_CNR), 103 WM_COMMAND, 104 MPFROM2SHORT(IDM_PREVIOUS,0), 105 mp2); 106 break; 107 } 108 /* else intentional fallthru */ 109 case DIR_SELECTED: 110 case DIR_VIEW: 111 case DIR_SORT: 112 { 113 POINTL ptl = {0,0}; 114 SWP swp; 115 DIRCNRDATA *dcd; 116 117 if(hwndButtonPopup) 118 WinDestroyWindow(hwndButtonPopup); 119 if(id == DIR_SELECTED && msg == WM_CONTEXTMENU) 120 id = DIR_MAX; 121 if(id == lastid) { 122 123 ULONG check; 124 125 DosQuerySysInfo(QSV_MS_COUNT, 126 QSV_MS_COUNT, 127 &check, 128 sizeof(check)); 129 if(check < timestamp + 500) { 130 lastid = 0; 131 goto MenuAbort; 132 } 133 } 134 hwndButtonPopup = WinLoadMenu(HWND_DESKTOP, 135 FM3ModHandle, 136 id); 137 if(hwndButtonPopup) { 138 WinSetWindowUShort(hwndButtonPopup, 139 QWS_ID, 140 id); 141 dcd = WinQueryWindowPtr(WinWindowFromID(WinQueryWindow(hwnd, 142 QW_PARENT), 143 DIR_CNR), 144 QWL_USER); 145 if(id == DIR_SORT) { /* don't have sort pathname in dirs */ 146 WinSendMsg(hwndButtonPopup, 147 MM_DELETEITEM, 148 MPFROM2SHORT(IDM_SORTNAME, 149 FALSE), 150 MPVOID); 151 WinSendMsg(hwndButtonPopup, 152 MM_DELETEITEM, 153 MPFROM2SHORT(IDM_SORTNONE, 154 FALSE), 155 MPVOID); 156 if(dcd) 157 SetSortChecks(hwndButtonPopup, 158 dcd->sortFlags); 159 } 160 else if(id == DIR_VIEW) { 161 if(dcd) { 162 SetViewMenu(hwndButtonPopup, 163 dcd->flWindowAttr); 164 SetDetailsSwitches(hwndButtonPopup, 165 dcd); 166 } 167 } 168 else if(id == DIR_MAX) { 169 170 int x; 171 BOOL enable; 172 USHORT ids[] = {IDM_SELECTBOTH, 173 IDM_SELECTMORE, 174 IDM_SELECTONE, 175 IDM_SELECTNEWER, 176 IDM_SELECTOLDER, 177 IDM_SELECTBIGGER, 178 IDM_SELECTSMALLER, 179 IDM_DESELECTBOTH, 180 IDM_DESELECTMORE, 181 IDM_DESELECTONE, 182 IDM_DESELECTNEWER, 183 IDM_DESELECTOLDER, 184 IDM_DESELECTBIGGER, 185 IDM_DESELECTSMALLER, 186 0}; 187 188 enable = (CountDirCnrs(dcd->hwndParent) > 1); 189 for(x = 0;ids[x];x++) 190 WinEnableMenuItem(hwndButtonPopup, 191 ids[x], 192 enable); 193 } 194 else if(id == DIR_SELECTED) { 195 if(dcd) 196 WinEnableMenuItem(hwndButtonPopup, 197 IDM_RESELECT, 198 (dcd->lastselection != NULL)); 199 } 200 ptl.x = 0; 201 if(WinPopupMenu(HWND_OBJECT, 202 HWND_OBJECT, 203 hwndButtonPopup, 204 -32767, 205 -32767, 206 0, 207 0)) { 208 WinQueryWindowPos(hwndButtonPopup, 209 &swp); 210 ptl.y = -(swp.cy + 2); 211 } 212 else { 213 WinQueryWindowPos(hwnd, 214 &swp); 215 ptl.y = swp.cy + 2; 216 } 217 if(WinPopupMenu(hwnd, 218 hwnd, 219 hwndButtonPopup, 220 ptl.x, 221 ptl.y, 222 0, 223 PU_HCONSTRAIN | PU_VCONSTRAIN | 224 PU_KEYBOARD | PU_MOUSEBUTTON1)) { 225 CenterOverWindow(hwndButtonPopup); 226 PaintRecessedWindow(hwnd, 227 (HPS)0, 228 FALSE, 229 FALSE); 230 } 231 } 232 } 233 break; 234 default: 235 PostMsg(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT),DIR_CNR), 236 WM_CONTROL, 237 MPFROM2SHORT(DIR_CNR,CN_CONTEXTMENU), 238 MPVOID); 239 break; 240 } 241 } // case WM_CONTENT_MENU 242 243 MenuAbort: 244 245 if(msg == UM_CONTEXTMENU) 246 return 0; 247 break; 248 249 case WM_MENUEND: 250 if(hwndButtonPopup == (HWND)mp2) { 251 lastid = WinQueryWindowUShort((HWND)mp2,QWS_ID); 252 WinDestroyWindow(hwndButtonPopup); 253 hwndButtonPopup = (HWND)0; 254 DosQuerySysInfo(QSV_MS_COUNT, 255 QSV_MS_COUNT, 256 ×tamp, 257 sizeof(timestamp)); 258 switch(lastid) { 259 case DIR_VIEW: 260 case DIR_SORT: 261 case DIR_FOLDERICON: 262 case DIR_SELECTED: 263 case DIR_MAX: 264 PaintRecessedWindow(hwnd,(HPS)0,TRUE,FALSE); 265 break; 266 } 267 } 268 break; 269 270 case WM_BUTTON3DOWN: 271 case WM_BUTTON1DOWN: 272 case WM_BUTTON3UP: 273 case WM_BUTTON1UP: 274 { 275 USHORT id; 276 277 id = WinQueryWindowUShort(hwnd,QWS_ID); 278 switch(id) { 279 case DIR_FILTER: 280 case DIR_VIEW: 281 case DIR_SORT: 282 case DIR_SELECTED: 283 case DIR_FOLDERICON: 284 case DIR_MAX: 285 return CommonTextButton(hwnd,msg,mp1,mp2); 286 } 287 } 288 break; 289 290 case WM_BUTTON1DBLCLK: 291 { 292 NOTIFYRECORDENTER nr; 293 294 memset(&nr,0,sizeof(NOTIFYRECORDENTER)); 295 nr.hwndCnr = WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT),DIR_CNR); 296 WinSendMsg(WinQueryWindow(hwnd,QW_PARENT), 297 WM_CONTROL, 298 MPFROM2SHORT(DIR_CNR,CN_ENTER), 299 MPFROMP(&nr)); 300 } 301 break; 302 303 case WM_MOUSEMOVE: 304 { 305 USHORT id = WinQueryWindowUShort(hwnd,QWS_ID); 306 char *s = NULL; 307 308 if(fOtherHelp) { 309 if((!hwndBubble || 310 WinQueryWindowULong(hwndBubble,QWL_USER) != hwnd) && 311 !WinQueryCapture(HWND_DESKTOP)) { 312 switch(id) { 313 case DIR_TOTALS: 314 s = GetPString(IDS_DIRCNRTOTALHELP); 315 break; 316 case DIR_SELECTED: 317 s = GetPString(IDS_DIRCNRSELECTEDHELP); 318 break; 319 case DIR_VIEW: 320 s = GetPString(IDS_DIRCNRVIEWHELP); 321 break; 322 case DIR_SORT: 323 s = GetPString(IDS_DIRCNRSORTHELP); 324 break; 325 case DIR_FILTER: 326 s = GetPString(IDS_DIRCNRFILTERHELP); 327 break; 328 case DIR_MAX: 329 s = GetPString(IDS_DIRCNRMAXHELP); 330 break; 331 case DIR_FOLDERICON: 332 s = GetPString(IDS_DIRCNRFOLDERHELP); 333 break; 334 default: 335 break; 336 } 337 if(s) 338 MakeBubble(hwnd,TRUE,s); 339 else if(hwndBubble) 340 WinDestroyWindow(hwndBubble); 341 } 342 } 343 switch(id) { 344 case DIR_MAX: 345 case DIR_FOLDERICON: 346 case DIR_FILTER: 347 case DIR_SORT: 348 case DIR_VIEW: 349 case DIR_SELECTED: 350 return CommonTextButton(hwnd,msg,mp1,mp2); 351 } 352 } 353 break; 354 355 case WM_CHORD: 356 case WM_BUTTON3CLICK: 357 case WM_BUTTON1CLICK: 358 case UM_CLICKED: 359 case UM_CLICKED3: 360 { 361 USHORT id,cmd = 0; 362 363 id = WinQueryWindowUShort(hwnd,QWS_ID); 364 if(msg == UM_CLICKED || msg == UM_CLICKED3) { 365 switch(id) { 366 case DIR_MAX: 367 cmd = IDM_MAXIMIZE; 368 break; 369 case DIR_VIEW: 370 case DIR_SELECTED: 371 case DIR_SORT: 372 PostMsg(hwnd, 373 UM_CONTEXTMENU, 374 MPVOID, 375 MPVOID); 376 break; 377 case DIR_FILTER: 378 cmd = IDM_FILTER; 379 break; 380 default: 381 break; 382 } 383 } 384 else if(id == DIR_FOLDERICON) { 385 if((msg == WM_BUTTON1CLICK && (SHORT2FROMMP(mp2) & KC_CTRL))) 386 cmd = IDM_PREVIOUS; 387 else if(msg == WM_BUTTON3CLICK || msg == WM_CHORD) 388 cmd = IDM_RESCAN; 389 else if(msg == WM_BUTTON1CLICK && (SHORT2FROMMP(mp2) & KC_SHIFT)) 390 cmd = IDM_WALKDIR; 391 else if(msg == WM_BUTTON1CLICK && (SHORT2FROMMP(mp2) & KC_ALT)) 392 cmd = IDM_WINDOWDLG; 393 else 394 cmd = IDM_PARENT; 395 } 396 if(cmd) 397 PostMsg(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT), 398 DIR_CNR), 399 WM_COMMAND, 400 MPFROM2SHORT(cmd,0), 401 MPVOID); 402 } 403 if(msg == UM_CLICKED || msg == UM_CLICKED3) 404 return 0; 405 break; 406 407 case DM_DROP: 408 case DM_DRAGOVER: 409 case DM_DRAGLEAVE: 410 case DM_DROPHELP: 411 case WM_BEGINDRAG: 412 if(msg == DM_DRAGOVER) { 413 if(!emphasized) { 414 emphasized = TRUE; 415 DrawTargetEmphasis(hwnd,emphasized); 416 } 417 } 418 else if(msg != WM_BEGINDRAG){ 419 if(emphasized) { 420 emphasized = FALSE; 421 DrawTargetEmphasis(hwnd,emphasized); 422 } 423 } 424 switch(WinQueryWindowUShort(hwnd,QWS_ID)) { 425 case DIR_FOLDERICON: 426 switch(msg) { 427 case DM_DRAGOVER: 428 if(AcceptOneDrop(mp1,mp2)) 429 return MRFROM2SHORT(DOR_DROP, 430 DO_MOVE); 431 return(MRFROM2SHORT(DOR_NODROP,0)); /* Drop not valid */ 432 case DM_DROPHELP: 433 DropHelp(mp1,mp2,hwnd, 434 GetPString(IDS_DIRCNRFOLDERDROPHELP)); 435 return 0; 436 case DM_DROP: 437 { 438 char szFrom[CCHMAXPATH + 2]; 439 440 if(emphasized) { 441 emphasized = FALSE; 442 DrawTargetEmphasis(hwnd,emphasized); 443 } 444 if(GetOneDrop(mp1,mp2,szFrom,sizeof(szFrom))) 445 WinSendMsg(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT), 446 DIR_CNR), 447 WM_COMMAND,MPFROM2SHORT(IDM_SWITCH,0), 448 MPFROMP(szFrom)); 449 } 450 return 0; 451 default: 452 return PFNWPStatic(hwnd,msg,mp1,mp2); 453 } 454 case DIR_MAX: 455 if(msg == WM_BEGINDRAG) 456 return PFNWPStatic(hwnd,msg,mp1,mp2); 457 default: 458 { 459 CNRDRAGINFO cnd; 460 USHORT dcmd; 461 462 switch(msg) { 463 case DM_DROP: 464 dcmd = CN_DROP; 465 break; 466 case DM_DRAGOVER: 467 dcmd = CN_DRAGOVER; 468 break; 469 case DM_DRAGLEAVE: 470 dcmd = CN_DRAGLEAVE; 471 break; 472 case DM_DROPHELP: 473 dcmd = CN_DROPHELP; 474 break; 475 case WM_BEGINDRAG: 476 dcmd = CN_INITDRAG; 477 break; 478 } 479 memset(&cnd,0,sizeof(cnd)); 480 cnd.pDragInfo = (PDRAGINFO)mp1; 481 cnd.pRecord = NULL; 482 return WinSendMsg(WinQueryWindow(hwnd,QW_PARENT), 483 WM_CONTROL, 484 MPFROM2SHORT(DIR_CNR,dcmd), 485 MPFROMP(&cnd)); 486 } 487 } 413 CNRDRAGINFO cnd; 414 USHORT dcmd; 415 416 switch (msg) { 417 case DM_DROP: 418 dcmd = CN_DROP; 419 break; 420 case DM_DRAGOVER: 421 dcmd = CN_DRAGOVER; 422 break; 423 case DM_DRAGLEAVE: 424 dcmd = CN_DRAGLEAVE; 425 break; 426 case DM_DROPHELP: 427 dcmd = CN_DROPHELP; 428 break; 429 case WM_BEGINDRAG: 430 dcmd = CN_INITDRAG; 431 break; 432 } 433 memset(&cnd, 0, sizeof(cnd)); 434 cnd.pDragInfo = (PDRAGINFO) mp1; 435 cnd.pRecord = NULL; 436 return WinSendMsg(WinQueryWindow(hwnd, QW_PARENT), 437 WM_CONTROL, 438 MPFROM2SHORT(DIR_CNR, dcmd), MPFROMP(&cnd)); 439 } 440 } 488 441 } 489 return PFNWPStatic(hwnd, msg,mp1,mp2);442 return PFNWPStatic(hwnd, msg, mp1, mp2); 490 443 } 491 444 492 493 MRESULT EXPENTRY DirClientWndProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)445 MRESULT EXPENTRY DirClientWndProc(HWND hwnd, ULONG msg, MPARAM mp1, 446 MPARAM mp2) 494 447 { 495 switch(msg) { 496 case UM_CONTAINERDIR: 497 if(mp1) { 498 499 DIRCNRDATA *dcd; 500 501 *(CHAR *)mp1 = 0; 502 dcd = WinQueryWindowPtr(WinWindowFromID(hwnd,DIR_CNR),QWL_USER); 503 if(dcd) 504 strcpy((CHAR *)mp1,dcd->directory); 505 return MRFROMLONG(TRUE); 506 } 448 switch (msg) { 449 case UM_CONTAINERDIR: 450 if (mp1) { 451 452 DIRCNRDATA *dcd; 453 454 *(CHAR *) mp1 = 0; 455 dcd = WinQueryWindowPtr(WinWindowFromID(hwnd, DIR_CNR), QWL_USER); 456 if (dcd) 457 strcpy((CHAR *) mp1, dcd->directory); 458 return MRFROMLONG(TRUE); 459 } 460 return 0; 461 462 case UM_CONTAINERHWND: 463 return MRFROMLONG(WinWindowFromID(hwnd, DIR_CNR)); 464 465 case UM_VIEWSMENU: 466 return MRFROMLONG(CheckMenu(&DirCnrMenu, DIRCNR_POPUP)); 467 468 case UM_DRIVECMD: 469 case WM_INITMENU: 470 case UM_FILTER: 471 case UM_INITMENU: 472 case MM_PORTHOLEINIT: 473 case UM_COMMAND: 474 case UM_FILESMENU: 475 case UM_UPDATERECORD: 476 case UM_UPDATERECORDLIST: 477 return WinSendMsg(WinWindowFromID(hwnd, DIR_CNR), msg, mp1, mp2); 478 479 case WM_PSETFOCUS: 480 case WM_SETFOCUS: 481 if (mp2) 482 PostMsg(hwnd, UM_FOCUSME, MPVOID, MPVOID); 483 break; 484 485 case UM_FOCUSME: 486 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, DIR_CNR)); 487 break; 488 489 case WM_PAINT: 490 { 491 HPS hps; 492 RECTL rcl; 493 494 hps = WinBeginPaint(hwnd, (HPS) 0, NULL); 495 if (hps) { 496 WinQueryWindowRect(hwnd, &rcl); 497 WinFillRect(hps, &rcl, CLR_PALEGRAY); 498 CommonTextPaint(hwnd, hps); 499 WinEndPaint(hps); 500 } 501 } 502 break; 503 504 case UM_SIZE: 505 case WM_SIZE: 506 if (msg == UM_SIZE) { 507 508 SWP swp; 509 510 WinQueryWindowPos(hwnd, &swp); 511 mp1 = MPFROM2SHORT(swp.cx, swp.cy); 512 mp2 = MPFROM2SHORT(swp.cx, swp.cy); 513 } 514 { 515 USHORT cx, cy, bx; 516 517 cx = SHORT1FROMMP(mp2); 518 cy = SHORT2FROMMP(mp2); 519 WinSetWindowPos(WinWindowFromID(hwnd, DIR_CNR), HWND_TOP, 520 0, 0, cx, cy - 24, SWP_SHOW | SWP_MOVE | SWP_SIZE); 521 if (WinWindowFromID(hwnd, DIR_MAX) != (HWND) 0) { 522 WinSetWindowPos(WinWindowFromID(hwnd, DIR_MAX), HWND_TOP, 523 cx - 22, 524 cy - 22, 20, 20, SWP_SHOW | SWP_MOVE | SWP_SIZE); 525 cx -= 24; 526 } 527 WinSetWindowPos(WinWindowFromID(hwnd, DIR_FOLDERICON), HWND_TOP, 528 2, cy - 22, 24, 20, SWP_SHOW | SWP_MOVE | SWP_SIZE); 529 WinSetWindowPos(WinWindowFromID(hwnd, DIR_TOTALS), HWND_TOP, 530 29, 531 cy - 22, 532 (cx / 3) - 2, 20, SWP_SHOW | SWP_MOVE | SWP_SIZE); 533 WinSetWindowPos(WinWindowFromID(hwnd, DIR_SELECTED), HWND_TOP, 534 29 + (cx / 3) + 2, 535 cy - 22, 536 (cx / 3) - 2, 20, SWP_SHOW | SWP_MOVE | SWP_SIZE); 537 bx = (cx - (29 + (((cx / 3) + 2) * 2))) / 3; 538 WinSetWindowPos(WinWindowFromID(hwnd, DIR_VIEW), HWND_TOP, 539 29 + (((cx / 3) + 2) * 2), 540 cy - 22, bx - 4, 20, SWP_SHOW | SWP_MOVE | SWP_SIZE); 541 WinSetWindowPos(WinWindowFromID(hwnd, DIR_SORT), HWND_TOP, 542 29 + (((cx / 3) + 2) * 2) + bx, 543 cy - 22, bx - 4, 20, SWP_SHOW | SWP_MOVE | SWP_SIZE); 544 WinSetWindowPos(WinWindowFromID(hwnd, DIR_FILTER), HWND_TOP, 545 29 + (((cx / 3) + 2) * 2) + (bx * 2), 546 cy - 22, bx - 4, 20, SWP_SHOW | SWP_MOVE | SWP_SIZE); 547 } 548 CommonTextPaint(hwnd, (HPS) 0); 549 if (msg == UM_SIZE) { 550 WinSetWindowPos(WinQueryWindow(hwnd, QW_PARENT), HWND_TOP, 0, 0, 0, 0, 551 SWP_SHOW | SWP_ZORDER | SWP_ACTIVATE); 507 552 return 0; 508 509 case UM_CONTAINERHWND: 510 return MRFROMLONG(WinWindowFromID(hwnd,DIR_CNR)); 511 512 case UM_VIEWSMENU: 513 return MRFROMLONG(CheckMenu(&DirCnrMenu,DIRCNR_POPUP)); 514 515 case UM_DRIVECMD: 516 case WM_INITMENU: 517 case UM_FILTER: 518 case UM_INITMENU: 519 case MM_PORTHOLEINIT: 520 case UM_COMMAND: 521 case UM_FILESMENU: 522 case UM_UPDATERECORD: 523 case UM_UPDATERECORDLIST: 524 return WinSendMsg(WinWindowFromID(hwnd,DIR_CNR),msg,mp1,mp2); 525 526 527 case WM_PSETFOCUS: 528 case WM_SETFOCUS: 529 if(mp2) 530 PostMsg(hwnd,UM_FOCUSME,MPVOID,MPVOID); 531 break; 532 533 case UM_FOCUSME: 534 WinSetFocus(HWND_DESKTOP,WinWindowFromID(hwnd,DIR_CNR)); 535 break; 536 537 case WM_PAINT: 538 { 539 HPS hps; 540 RECTL rcl; 541 542 hps = WinBeginPaint(hwnd,(HPS)0,NULL); 543 if(hps) { 544 WinQueryWindowRect(hwnd,&rcl); 545 WinFillRect(hps,&rcl,CLR_PALEGRAY); 546 CommonTextPaint(hwnd,hps); 547 WinEndPaint(hps); 548 } 549 } 550 break; 551 552 case UM_SIZE: 553 case WM_SIZE: 554 if(msg == UM_SIZE) { 555 556 SWP swp; 557 558 WinQueryWindowPos(hwnd,&swp); 559 mp1 = MPFROM2SHORT(swp.cx,swp.cy); 560 mp2 = MPFROM2SHORT(swp.cx,swp.cy); 561 } 562 { 563 USHORT cx,cy,bx; 564 565 cx = SHORT1FROMMP(mp2); 566 cy = SHORT2FROMMP(mp2); 567 WinSetWindowPos(WinWindowFromID(hwnd,DIR_CNR),HWND_TOP, 568 0, 569 0, 570 cx, 571 cy - 24, 572 SWP_SHOW | SWP_MOVE | SWP_SIZE); 573 if(WinWindowFromID(hwnd,DIR_MAX) != (HWND)0) { 574 WinSetWindowPos(WinWindowFromID(hwnd,DIR_MAX),HWND_TOP, 575 cx - 22, 576 cy - 22, 577 20,20,SWP_SHOW | SWP_MOVE | SWP_SIZE); 578 cx -= 24; 579 } 580 WinSetWindowPos(WinWindowFromID(hwnd,DIR_FOLDERICON),HWND_TOP, 581 2, 582 cy - 22, 583 24, 584 20, 585 SWP_SHOW | SWP_MOVE | SWP_SIZE); 586 WinSetWindowPos(WinWindowFromID(hwnd,DIR_TOTALS),HWND_TOP, 587 29, 588 cy - 22, 589 (cx / 3) - 2, 590 20, 591 SWP_SHOW | SWP_MOVE | SWP_SIZE); 592 WinSetWindowPos(WinWindowFromID(hwnd,DIR_SELECTED),HWND_TOP, 593 29 + (cx / 3) + 2, 594 cy - 22, 595 (cx / 3) - 2, 596 20, 597 SWP_SHOW | SWP_MOVE | SWP_SIZE); 598 bx = (cx - (29 + (((cx / 3) + 2) * 2))) / 3; 599 WinSetWindowPos(WinWindowFromID(hwnd,DIR_VIEW),HWND_TOP, 600 29 + (((cx / 3) + 2) * 2), 601 cy - 22, 602 bx - 4, 603 20, 604 SWP_SHOW | SWP_MOVE | SWP_SIZE); 605 WinSetWindowPos(WinWindowFromID(hwnd,DIR_SORT),HWND_TOP, 606 29 + (((cx / 3) + 2) * 2) + bx, 607 cy - 22, 608 bx - 4, 609 20, 610 SWP_SHOW | SWP_MOVE | SWP_SIZE); 611 WinSetWindowPos(WinWindowFromID(hwnd,DIR_FILTER),HWND_TOP, 612 29 + (((cx / 3) + 2) * 2) + (bx * 2), 613 cy - 22, 614 bx - 4, 615 20, 616 SWP_SHOW | SWP_MOVE | SWP_SIZE); 617 } 618 CommonTextPaint(hwnd,(HPS)0); 619 if(msg == UM_SIZE) { 620 WinSetWindowPos(WinQueryWindow(hwnd,QW_PARENT),HWND_TOP,0,0,0,0, 621 SWP_SHOW | SWP_ZORDER | SWP_ACTIVATE); 622 return 0; 623 } 624 break; 625 626 case WM_COMMAND: 627 case WM_CONTROL: 628 case WM_CLOSE: 629 return WinSendMsg(WinWindowFromID(hwnd,DIR_CNR), 630 msg, 631 mp1, 632 mp2); 553 } 554 break; 555 556 case WM_COMMAND: 557 case WM_CONTROL: 558 case WM_CLOSE: 559 return WinSendMsg(WinWindowFromID(hwnd, DIR_CNR), msg, mp1, mp2); 633 560 } 634 return WinDefWindowProc(hwnd, msg,mp1,mp2);561 return WinDefWindowProc(hwnd, msg, mp1, mp2); 635 562 } 636 563 637 638 MRESULT EXPENTRY DirObjWndProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2) 564 MRESULT EXPENTRY DirObjWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) 639 565 { 640 566 DIRCNRDATA *dcd; 641 567 642 switch(msg) { 643 case WM_CREATE: 568 switch (msg) { 569 case WM_CREATE: 570 break; 571 572 case DM_PRINTOBJECT: 573 return MRFROMLONG(DRR_TARGET); 574 575 case DM_DISCARDOBJECT: 576 dcd = INSTDATA(hwnd); 577 if (fFM2Deletes && dcd) { 578 579 LISTINFO *li; 580 CNRDRAGINFO cni; 581 582 cni.pRecord = NULL; 583 cni.pDragInfo = (PDRAGINFO) mp1; 584 li = 585 DoFileDrop(dcd->hwndCnr, dcd->directory, FALSE, MPVOID, 586 MPFROMP(&cni)); 587 if (li) { 588 li->type = (fDefaultDeletePerm) ? IDM_PERMDELETE : IDM_DELETE; 589 if (!PostMsg(hwnd, UM_MASSACTION, MPFROMP(li), MPVOID)) 590 FreeListInfo(li); 591 else 592 return MRFROMLONG(DRR_SOURCE); 593 } 594 } 595 return MRFROMLONG(DRR_TARGET); 596 597 case UM_UPDATERECORDLIST: 598 dcd = WinQueryWindowPtr(hwnd, QWL_USER); 599 if (dcd && mp1) { 600 601 INT numentries = 0; 602 CHAR **list = (CHAR **) mp1; 603 604 while (list[numentries]) 605 numentries++; 606 if (numentries) 607 UpdateCnrList(dcd->hwndCnr, list, numentries, TRUE, dcd); 608 } 609 return 0; 610 611 case UM_SETUP: 612 dcd = WinQueryWindowPtr(hwnd, QWL_USER); 613 if (dcd) { 614 /* set unique id */ 615 WinSetWindowUShort(hwnd, QWS_ID, DIROBJ_FRAME + (DIR_FRAME - dcd->id)); 616 dcd->hwndObject = hwnd; 617 if (ParentIsDesktop(hwnd, dcd->hwndParent)) 618 DosSleep(250L); 619 } 620 else 621 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID); 622 return 0; 623 624 case UM_RESCAN2: 625 dcd = WinQueryWindowPtr(hwnd, QWL_USER); 626 if (dcd && dcd->hwndFrame == WinQueryActiveWindow(dcd->hwndParent)) { 627 628 FSALLOCATE fsa; 629 CHAR s[CCHMAXPATH * 2]; 630 CHAR tf[64]; 631 CHAR tb[64]; 632 CHAR szFree[64]; 633 634 DosError(FERR_DISABLEHARDERR); 635 if (!DosQueryFSInfo(toupper(*dcd->directory) - '@', 636 FSIL_ALLOC, &fsa, sizeof(FSALLOCATE))) { 637 CommaFmtULL(tb, sizeof(tb), 638 (ULONGLONG) fsa.cUnitAvail * (fsa.cSectorUnit * 639 fsa.cbSector), 'K'); 640 sprintf(szFree, " {%s %s}", tb, GetPString(IDS_FREETEXT)); 641 } 642 else 643 *szFree = 0; 644 commafmt(tf, sizeof(tf), dcd->totalfiles); 645 CommaFmtULL(tb, sizeof(tb), dcd->ullTotalBytes, ' '); 646 if (!fMoreButtons) { 647 sprintf(s, " [%s / %s]%s%s%s%s %s", 648 tf, tb, szFree, 649 (*dcd->mask.szMask || dcd->mask.antiattr || 650 dcd->mask.attrFile != ALLATTRS) ? " (" : NullStr, 651 (*dcd->mask.szMask) ? dcd->mask.szMask : 652 (dcd->mask.antiattr || 653 dcd->mask.attrFile != ALLATTRS) ? 654 GetPString(IDS_ALLTEXT) : NullStr, 655 (*dcd->mask.szMask || dcd->mask.antiattr || 656 dcd->mask.attrFile != ALLATTRS) ? ")" : NullStr, 657 dcd->directory); 658 } 659 else { 660 sprintf(s, " [%s / %s]%s %s", tf, tb, szFree, dcd->directory); 661 } 662 if (dcd->hwndFrame == WinQueryActiveWindow(dcd->hwndParent)) 663 WinSetWindowText(hwndStatus, s); 664 } 665 return 0; 666 667 case UM_FLESH: 668 dcd = WinQueryWindowPtr(hwnd, QWL_USER); 669 if (dcd) { 670 671 PCNRITEM pci, pciC; 672 673 pci = WinSendMsg(dcd->hwndCnr, 674 CM_QUERYRECORD, 675 MPVOID, MPFROM2SHORT(CMA_FIRST, CMA_ITEMORDER)); 676 while (pci && (INT) pci != -1) { 677 if (pci->attrFile & FILE_DIRECTORY) { 678 pciC = WinSendMsg(dcd->hwndCnr, 679 CM_QUERYRECORD, 680 MPFROMP(pci), 681 MPFROM2SHORT(CMA_FIRSTCHILD, CMA_ITEMORDER)); 682 if (!pciC) { 683 Stubby(dcd->hwndCnr, pci); 684 DosSleep(0L); 685 } 686 } 687 pci = WinSendMsg(dcd->hwndCnr, 688 CM_QUERYRECORD, 689 MPFROMP(pci), MPFROM2SHORT(CMA_NEXT, CMA_ITEMORDER)); 690 } 691 dcd->firsttree = TRUE; 692 } 693 return 0; 694 695 case UM_RESCAN: 696 /* 697 * populate container 698 */ 699 dcd = WinQueryWindowPtr(hwnd, QWL_USER); 700 if (dcd) { 701 DosEnterCritSec(); 702 if (dcd->stopflag) 703 dcd->stopflag--; 704 if (dcd->stopflag) { 705 DosExitCritSec(); 706 return 0; 707 } 708 DosExitCritSec(); 709 if (mp1) { 710 strcpy(dcd->previous, dcd->directory); 711 strcpy(dcd->directory, (CHAR *) mp1); 712 } 713 MakeValidDir(dcd->directory); 714 { 715 CHAR s[CCHMAXPATH + 8]; 716 717 sprintf(s, 718 "%s%s%s", 719 (ParentIsDesktop(dcd->hwndFrame, (HWND) 0)) ? 720 "VDir" : 721 NullStr, 722 (ParentIsDesktop(dcd->hwndFrame, (HWND) 0)) ? 723 (!dcd->dontclose) ? 724 " Master: " : ": " : NullStr, dcd->directory); 725 WinSetWindowText(dcd->hwndFrame, s); 726 WinSetWindowText(WinWindowFromID(dcd->hwndFrame, FID_TITLEBAR), s); 727 } 728 WinSendMsg(dcd->hwndCnr, 729 CM_REMOVERECORD, 730 MPVOID, 731 MPFROM2SHORT(0, CMA_FREE | CMA_INVALIDATE | CMA_ERASE)); 732 AdjustCnrColsForFSType(dcd->hwndCnr, dcd->directory, dcd); 733 dcd->ullTotalBytes = dcd->totalfiles = 734 dcd->selectedfiles = dcd->selectedbytes = 0; 735 WinSetDlgItemText(dcd->hwndClient, DIR_TOTALS, "0 / 0k"); 736 WinSetDlgItemText(dcd->hwndClient, DIR_SELECTED, "0 / 0k"); 737 if (hwndStatus && 738 dcd->hwndFrame == WinQueryActiveWindow(dcd->hwndParent)) { 739 WinSetWindowText(hwndStatus, GetPString(IDS_SCANNINGTEXT)); 740 if (hwndMain) 741 WinSendMsg(hwndMain, UM_LOADFILE, MPVOID, MPVOID); 742 } 743 if (fSwitchTree && hwndTree) { 744 if (hwndMain) { 745 if (TopWindow(hwndMain, (HWND) 0) == dcd->hwndFrame) 746 WinSendMsg(hwndTree, UM_SHOWME, MPFROMP(dcd->directory), MPVOID); 747 } 748 else 749 WinSendMsg(hwndTree, UM_SHOWME, MPFROMP(dcd->directory), MPVOID); 750 } 751 dcd->firsttree = FALSE; 752 // fixme to check errors 753 FillDirCnr(dcd->hwndCnr, dcd->directory, dcd, &dcd->ullTotalBytes); 754 PostMsg(dcd->hwndCnr, UM_RESCAN, MPVOID, MPVOID); 755 if (mp2 && !fLeaveTree && (dcd->flWindowAttr & CV_TREE)) { 756 757 ULONG flWindowAttr = dcd->flWindowAttr; 758 CNRINFO cnri; 759 760 flWindowAttr &= 761 (~(CV_NAME | CV_TREE | CV_ICON | CV_DETAIL | CV_TEXT)); 762 if (dcd->lastattr) { 763 if (dcd->lastattr & CV_TEXT) 764 flWindowAttr |= CV_TEXT; 765 else if (dcd->lastattr & CV_DETAIL) 766 flWindowAttr |= CV_DETAIL; 767 else if (dcd->lastattr & CV_ICON) 768 flWindowAttr |= CV_ICON; 769 else 770 flWindowAttr |= CV_NAME; 771 } 772 else 773 flWindowAttr |= CV_NAME; 774 flWindowAttr |= CV_FLOW; 775 memset(&cnri, 0, sizeof(CNRINFO)); 776 cnri.cb = sizeof(CNRINFO); 777 if (WinSendMsg(dcd->hwndCnr, CM_QUERYCNRINFO, MPFROMP(&cnri), 778 MPFROMLONG(sizeof(CNRINFO)))) { 779 dcd->flWindowAttr = cnri.flWindowAttr = flWindowAttr; 780 WinSendMsg(dcd->hwndCnr, CM_SETCNRINFO, 781 MPFROMP(&cnri), MPFROMLONG(CMA_FLWINDOWATTR)); 782 SayView(WinWindowFromID(dcd->hwndClient, 783 DIR_VIEW), dcd->flWindowAttr); 784 } 785 } 786 if (dcd->flWindowAttr & CV_TREE) 787 PostMsg(dcd->hwndObject, UM_FLESH, MPVOID, MPVOID); 788 if (*dcd->previous) { 789 if (strlen(dcd->previous) > strlen(dcd->directory) && 790 !strnicmp(dcd->directory, dcd->previous, 791 strlen(dcd->directory))) { 792 793 PCNRITEM pci; 794 795 pci = FindCnrRecord(dcd->hwndCnr, 796 dcd->previous, NULL, TRUE, FALSE, TRUE); 797 if (pci && (INT) pci != -1) { 798 /* make found item current (cursored) item */ 799 WinSendMsg(dcd->hwndCnr, CM_SETRECORDEMPHASIS, MPFROMP(pci), 800 MPFROM2SHORT(TRUE, CRA_CURSORED)); 801 /* make sure that record shows in viewport */ 802 ShowCnrRecord(dcd->hwndCnr, (PMINIRECORDCORE) pci); 803 } 804 } 805 } 806 } 807 return 0; 808 809 case UM_COMMAND: 810 if (mp1) { 811 812 LISTINFO *li = (LISTINFO *) mp1; 813 814 switch (li->type) { 815 case IDM_DOITYOURSELF: 816 case IDM_APPENDTOCLIP: 817 case IDM_SAVETOCLIP: 818 case IDM_ARCHIVE: 819 case IDM_ARCHIVEM: 820 case IDM_VIEWTEXT: 821 case IDM_VIEWBINARY: 822 case IDM_VIEWARCHIVE: 823 case IDM_VIEW: 824 case IDM_EDITTEXT: 825 case IDM_EDITBINARY: 826 case IDM_EDIT: 827 case IDM_OBJECT: 828 case IDM_SHADOW: 829 case IDM_SHADOW2: 830 case IDM_PRINT: 831 case IDM_ATTRS: 832 case IDM_DELETE: 833 case IDM_PERMDELETE: 834 case IDM_MCIPLAY: 835 case IDM_UPDATE: 836 if (PostMsg(hwnd, UM_MASSACTION, mp1, mp2)) 837 return (MRESULT) TRUE; 838 break; 839 default: 840 if (PostMsg(hwnd, UM_ACTION, mp1, mp2)) 841 return (MRESULT) TRUE; 842 } 843 } 844 return 0; 845 846 case UM_SELECT: 847 dcd = WinQueryWindowPtr(hwnd, QWL_USER); 848 if (dcd) { 849 switch (SHORT1FROMMP(mp1)) { 850 case IDM_SELECTBOTH: 851 case IDM_SELECTONE: 852 case IDM_SELECTMORE: 853 case IDM_SELECTNEWER: 854 case IDM_SELECTOLDER: 855 case IDM_SELECTBIGGER: 856 case IDM_SELECTSMALLER: 857 case IDM_DESELECTBOTH: 858 case IDM_DESELECTONE: 859 case IDM_DESELECTMORE: 860 case IDM_DESELECTNEWER: 861 case IDM_DESELECTOLDER: 862 case IDM_DESELECTBIGGER: 863 case IDM_DESELECTSMALLER: 864 SpecialSelect2(dcd->hwndParent, SHORT1FROMMP(mp1)); 865 break; 866 case IDM_SELECTLIST: 867 { 868 CHAR filename[CCHMAXPATH], *p, *pp; 869 ULONG size; 870 871 strcpy(filename, "*.LST"); 872 size = CCHMAXPATH; 873 PrfQueryProfileData(fmprof, appname, "SaveToListName", 874 filename, &size); 875 pp = strrchr(filename, '\\'); 876 if (!pp) 877 pp = filename; 878 p = strrchr(pp, '.'); 879 if (p && *(p + 1) && p > pp + 1) { 880 if (pp > filename) 881 pp++; 882 *pp = '*'; 883 pp++; 884 if (p > pp) 885 memmove(pp, p, strlen(p) + 1); 886 } 887 if (insert_filename(hwnd, filename, FALSE, FALSE)) 888 SelectList(dcd->hwndCnr, TRUE, FALSE, FALSE, NULL, filename, 889 NULL); 890 } 891 break; 892 case IDM_SELECTALL: 893 SelectAll(dcd->hwndCnr, TRUE, TRUE, NULL, NULL, FALSE); 894 break; 895 case IDM_DESELECTALL: 896 DeselectAll(dcd->hwndCnr, TRUE, TRUE, NULL, NULL, FALSE); 897 break; 898 case IDM_SELECTALLFILES: 899 SelectAll(dcd->hwndCnr, TRUE, FALSE, NULL, NULL, FALSE); 900 break; 901 case IDM_DESELECTALLFILES: 902 DeselectAll(dcd->hwndCnr, TRUE, FALSE, NULL, NULL, FALSE); 903 break; 904 case IDM_SELECTALLDIRS: 905 SelectAll(dcd->hwndCnr, FALSE, TRUE, NULL, NULL, FALSE); 906 break; 907 case IDM_DESELECTALLDIRS: 908 DeselectAll(dcd->hwndCnr, FALSE, TRUE, NULL, NULL, FALSE); 909 break; 910 case IDM_DESELECTMASK: 911 case IDM_SELECTMASK: 912 { 913 MASK mask; 914 PCNRITEM pci = (PCNRITEM) mp2; 915 916 memset(&mask, 0, sizeof(MASK)); 917 mask.fNoAttribs = TRUE; 918 mask.fNoDirs = TRUE; 919 mask.fText = TRUE; 920 strcpy(mask.prompt, 921 GetPString((SHORT1FROMMP(mp1) == IDM_SELECTMASK) ? 922 IDS_SELECTFILTERTEXT : IDS_DESELECTFILTERTEXT)); 923 if (pci && (INT) pci != -1) 924 strcpy(mask.szMask, pci->szFileName); 925 if (WinDlgBox(HWND_DESKTOP, 926 dcd->hwndCnr, 927 PickMaskDlgProc, 928 FM3ModHandle, MSK_FRAME, MPFROMP(&mask))) { 929 if (SHORT1FROMMP(mp1) == IDM_SELECTMASK) 930 SelectAll(dcd->hwndCnr, 931 TRUE, TRUE, mask.szMask, mask.szText, FALSE); 932 else 933 DeselectAll(dcd->hwndCnr, 934 TRUE, TRUE, mask.szMask, mask.szText, FALSE); 935 } 936 } 937 break; 938 939 case IDM_DESELECTCLIP: 940 case IDM_SELECTCLIP: 941 { 942 CHAR **list; 943 944 list = ListFromClipboard(hwnd); 945 if (list) { 946 SelectList(dcd->hwndCnr, TRUE, FALSE, 947 (SHORT1FROMMP(mp1) == IDM_DESELECTCLIP), 948 NULL, NULL, list); 949 FreeList(list); 950 } 951 } 952 break; 953 954 case IDM_INVERT: 955 InvertAll(dcd->hwndCnr); 956 break; 957 } 958 } 959 return 0; 960 961 case UM_MASSACTION: 962 if (mp1) { 963 964 dcd = WinQueryWindowPtr(hwnd, QWL_USER); 965 if (dcd) { 966 967 WORKER *wk; 968 969 wk = xmallocz(sizeof(WORKER), pszSrcFile, __LINE__); 970 if (!wk) 971 FreeListInfo((LISTINFO *) mp1); 972 else { 973 wk->size = sizeof(WORKER); 974 wk->hwndCnr = dcd->hwndCnr; 975 wk->hwndParent = dcd->hwndParent; 976 wk->hwndFrame = dcd->hwndFrame; 977 wk->hwndClient = dcd->hwndClient; 978 wk->li = (LISTINFO *) mp1; 979 strcpy(wk->directory, dcd->directory); 980 if (_beginthread(MassAction, NULL, 122880, (PVOID) wk) == -1) { 981 Runtime_Error(pszSrcFile, __LINE__, 982 GetPString(IDS_COULDNTSTARTTHREADTEXT)); 983 free(wk); 984 FreeListInfo((LISTINFO *) mp1); 985 } 986 } 987 } 988 } 989 return 0; 990 991 case UM_ACTION: 992 if (mp1) { 993 994 dcd = WinQueryWindowPtr(hwnd, QWL_USER); 995 if (dcd) { 996 997 WORKER *wk; 998 999 wk = xmallocz(sizeof(WORKER), pszSrcFile, __LINE__); 1000 if (!wk) 1001 FreeListInfo((LISTINFO *) mp1); 1002 else { 1003 wk->size = sizeof(WORKER); 1004 wk->hwndCnr = dcd->hwndCnr; 1005 wk->hwndParent = dcd->hwndParent; 1006 wk->hwndFrame = dcd->hwndFrame; 1007 wk->hwndClient = dcd->hwndClient; 1008 wk->li = (LISTINFO *) mp1; 1009 strcpy(wk->directory, dcd->directory); 1010 if (_beginthread(Action, NULL, 122880, (PVOID) wk) == -1) { 1011 Runtime_Error(pszSrcFile, __LINE__, 1012 GetPString(IDS_COULDNTSTARTTHREADTEXT)); 1013 free(wk); 1014 FreeListInfo((LISTINFO *) mp1); 1015 } 1016 } 1017 } 1018 } 1019 return 0; 1020 1021 case WM_CLOSE: 1022 WinDestroyWindow(hwnd); 1023 break; 1024 1025 case WM_DESTROY: 1026 dcd = WinQueryWindowPtr(hwnd, QWL_USER); 1027 if (dcd) { 1028 if (dcd->hwndRestore) 1029 WinSetWindowPos(dcd->hwndRestore, 1030 HWND_TOP, 1031 0, 1032 0, 1033 0, 1034 0, 1035 SWP_RESTORE | SWP_SHOW | SWP_ACTIVATE | SWP_ZORDER); 1036 FreeList(dcd->lastselection); 1037 free(dcd); 1038 DosPostEventSem(CompactSem); 1039 } 1040 if (!PostMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID)) 1041 WinSendMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID); 1042 break; 1043 } 1044 return WinDefWindowProc(hwnd, msg, mp1, mp2); 1045 } 1046 1047 MRESULT EXPENTRY DirCnrWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) 1048 { 1049 DIRCNRDATA *dcd = WinQueryWindowPtr(hwnd, QWL_USER); 1050 1051 switch (msg) { 1052 case DM_PRINTOBJECT: 1053 return MRFROMLONG(DRR_TARGET); 1054 1055 case DM_DISCARDOBJECT: 1056 if (dcd) 1057 return WinSendMsg(dcd->hwndObject, msg, mp1, mp2); 1058 else 1059 return MRFROMLONG(DRR_TARGET); 1060 1061 case WM_CHAR: 1062 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL)); 1063 if (SHORT1FROMMP(mp1) & KC_KEYUP) 1064 return (MRESULT) TRUE; 1065 if (SHORT1FROMMP(mp1) & KC_VIRTUALKEY) { 1066 switch (SHORT2FROMMP(mp2)) { 1067 case VK_INSERT: 1068 if ((shiftstate & KC_CTRL) == KC_CTRL) 1069 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_MKDIR, 0), MPVOID); 1070 else if ((shiftstate & KC_ALT) == KC_ALT) 1071 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_CREATE, 0), MPVOID); 1072 break; 1073 case VK_PAGEUP: 1074 if ((shiftstate & KC_CTRL) == KC_CTRL) 1075 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_PARENT, 0), MPVOID); 1076 break; 1077 case VK_PAGEDOWN: 1078 if ((shiftstate & KC_CTRL) == KC_CTRL) 1079 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_PREVIOUS, 0), MPVOID); 1080 break; 1081 case VK_HOME: 1082 if ((shiftstate & KC_CTRL) == KC_CTRL && dcd) { 1083 1084 CHAR s[CCHMAXPATH], *p; 1085 1086 strcpy(s, dcd->directory); 1087 p = strchr(s, '\\'); 1088 if (p) { 1089 p++; 1090 *p = 0; 1091 WinSendMsg(hwnd, UM_SETDIR, MPFROMP(s), MPVOID); 1092 } 1093 } 1094 break; 1095 case VK_DELETE: 1096 if ((shiftstate & KC_CTRL) == KC_CTRL) 1097 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_PERMDELETE, 0), MPVOID); 1098 else if ((shiftstate & KC_SHIFT) == KC_SHIFT) 1099 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_SAVETOCLIP, 0), MPVOID); 1100 else 1101 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_DELETE, 0), MPVOID); 1102 break; 1103 } 1104 } 1105 if (shiftstate || fNoSearch) 644 1106 break; 645 646 case DM_PRINTOBJECT: 647 return MRFROMLONG(DRR_TARGET); 648 649 case DM_DISCARDOBJECT: 650 dcd = INSTDATA(hwnd); 651 if(fFM2Deletes && dcd) { 652 653 LISTINFO *li; 654 CNRDRAGINFO cni; 655 656 cni.pRecord = NULL; 657 cni.pDragInfo = (PDRAGINFO)mp1; 658 li = DoFileDrop(dcd->hwndCnr,dcd->directory,FALSE,MPVOID,MPFROMP(&cni)); 659 if(li) { 660 li->type = (fDefaultDeletePerm) ? IDM_PERMDELETE : IDM_DELETE; 661 if(!PostMsg(hwnd,UM_MASSACTION,MPFROMP(li),MPVOID)) 662 FreeListInfo(li); 663 else 664 return MRFROMLONG(DRR_SOURCE); 665 } 666 } 667 return MRFROMLONG(DRR_TARGET); 668 669 case UM_UPDATERECORDLIST: 670 dcd = WinQueryWindowPtr(hwnd,QWL_USER); 671 if(dcd && mp1) { 672 673 INT numentries = 0; 674 CHAR **list = (CHAR **)mp1; 675 676 while(list[numentries]) 677 numentries++; 678 if(numentries) 679 UpdateCnrList(dcd->hwndCnr, 680 list, 681 numentries, 682 TRUE, 683 dcd); 684 } 1107 if (SHORT1FROMMP(mp1) & KC_CHAR) { 1108 1109 ULONG thistime, len; 1110 SEARCHSTRING srch; 1111 PCNRITEM pci; 1112 1113 if (!dcd) 1114 break; 1115 switch (SHORT1FROMMP(mp2)) { 1116 case '\x1b': 1117 case '\r': 1118 case '\n': 1119 dcd->lasttime = 0; 1120 *dcd->szCommonName = 0; 1121 break; 1122 default: 1123 thistime = WinQueryMsgTime(WinQueryAnchorBlock(hwnd)); 1124 if (thistime > dcd->lasttime + 1250) 1125 *dcd->szCommonName = 0; 1126 dcd->lasttime = thistime; 1127 if (SHORT1FROMMP(mp2) == ' ' && !dcd->szCommonName) 1128 break; 1129 KbdRetry: 1130 len = strlen(dcd->szCommonName); 1131 if (len >= CCHMAXPATH - 1) { 1132 *dcd->szCommonName = 0; 1133 len = 0; 1134 } 1135 dcd->szCommonName[len] = toupper(SHORT1FROMMP(mp2)); 1136 dcd->szCommonName[len + 1] = 0; 1137 memset(&srch, 0, sizeof(SEARCHSTRING)); 1138 srch.cb = (ULONG) sizeof(SEARCHSTRING); 1139 srch.pszSearch = (PSZ) dcd->szCommonName; 1140 srch.fsPrefix = TRUE; 1141 srch.fsCaseSensitive = FALSE; 1142 srch.usView = CV_ICON; 1143 pci = WinSendMsg(hwnd, CM_SEARCHSTRING, MPFROMP(&srch), 1144 MPFROMLONG(CMA_FIRST)); 1145 if (pci && (INT) pci != -1) { 1146 1147 USHORT attrib = CRA_CURSORED; 1148 1149 /* make found item current item */ 1150 if (!stricmp(pci->pszFileName, dcd->szCommonName)) 1151 attrib |= CRA_SELECTED; 1152 WinSendMsg(hwnd, CM_SETRECORDEMPHASIS, MPFROMP(pci), 1153 MPFROM2SHORT(TRUE, attrib)); 1154 /* make sure that record shows in viewport */ 1155 ShowCnrRecord(hwnd, (PMINIRECORDCORE) pci); 1156 return (MRESULT) TRUE; 1157 } 1158 else { 1159 if (SHORT1FROMMP(mp2) == ' ') { 1160 dcd->szCommonName[len] = 0; 1161 break; 1162 } 1163 *dcd->szCommonName = 0; 1164 dcd->lasttime = 0; 1165 if (len) // retry as first letter if no match 1166 goto KbdRetry; 1167 } 1168 break; 1169 } 1170 } 1171 break; 1172 1173 case WM_MOUSEMOVE: 1174 case WM_BUTTON1UP: 1175 case WM_BUTTON2UP: 1176 case WM_BUTTON3UP: 1177 case WM_CHORD: 1178 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL)); 1179 break; 1180 1181 case WM_BUTTON1MOTIONEND: 1182 { 1183 CNRINFO cnri; 1184 1185 memset(&cnri, 0, sizeof(CNRINFO)); 1186 cnri.cb = sizeof(CNRINFO); 1187 if (WinSendMsg(hwnd, CM_QUERYCNRINFO, MPFROMP(&cnri), 1188 MPFROMLONG(sizeof(CNRINFO)))) { 1189 if (cnri.flWindowAttr & CV_DETAIL) 1190 PrfWriteProfileData(fmprof, appname, "CnrSplitBar", 1191 (PVOID) & cnri.xVertSplitbar, sizeof(LONG)); 1192 } 1193 } 1194 break; 1195 1196 case UM_COMPARE: 1197 if (dcd && mp1 && mp2) { 1198 1199 COMPARE *cmp; 1200 CHAR *leftdir = (CHAR *) mp1, *rightdir = (CHAR *) mp2; 1201 1202 if (!IsFile(leftdir) && !IsFile(rightdir)) { 1203 cmp = xmallocz(sizeof(COMPARE), pszSrcFile, __LINE__); 1204 if (cmp) { 1205 cmp->size = sizeof(COMPARE); 1206 strcpy(cmp->leftdir, leftdir); 1207 strcpy(cmp->rightdir, rightdir); 1208 cmp->hwndParent = dcd->hwndParent; 1209 cmp->dcd.hwndParent = dcd->hwndParent; 1210 WinDlgBox(HWND_DESKTOP, 1211 HWND_DESKTOP, 1212 CompareDlgProc, FM3ModHandle, COMP_FRAME, MPFROMP(cmp)); 1213 } 1214 } 1215 } 1216 return 0; 1217 1218 case WM_PRESPARAMCHANGED: 1219 PresParamChanged(hwnd, "DirCnr", mp1, mp2); 1220 break; 1221 1222 case UM_UPDATERECORDLIST: 1223 if (dcd && mp1) 1224 WinSendMsg(dcd->hwndObject, msg, mp1, mp2); 1225 return 0; 1226 1227 case UM_UPDATERECORD: 1228 if (dcd && mp1) { 1229 1230 CHAR *filename; 1231 1232 filename = mp1; 1233 if (filename) 1234 UpdateCnrRecord(hwnd, filename, TRUE, dcd); 1235 } 1236 return 0; 1237 1238 case WM_SETFOCUS: 1239 /* 1240 * put name of our window (directory name) on status line 1241 */ 1242 if (dcd && hwndStatus && mp2) { 1243 1244 PCNRITEM pci = NULL; 1245 1246 if (fAutoView && hwndMain) { 1247 pci = WinSendMsg(hwnd, CM_QUERYRECORDEMPHASIS, MPFROMLONG(CMA_FIRST), 1248 MPFROMSHORT(CRA_CURSORED)); 1249 if (pci && (INT) pci != -1 && 1250 (!(driveflags[toupper(*pci->szFileName) - 'A'] & DRIVE_SLOW))) 1251 WinSendMsg(hwndMain, UM_LOADFILE, MPFROMP(pci->szFileName), MPVOID); 1252 else 1253 WinSendMsg(hwndMain, UM_LOADFILE, MPVOID, MPVOID); 1254 } 1255 if (*dcd->directory) { 1256 if (hwndMain) 1257 WinSendMsg(hwndMain, 1258 UM_SETUSERLISTNAME, MPFROMP(dcd->directory), MPVOID); 1259 else 1260 add_udir(FALSE, dcd->directory); 1261 } 1262 if (hwndMain) 1263 PostMsg(hwndMain, UM_ADVISEFOCUS, MPFROMLONG(dcd->hwndFrame), MPVOID); 1264 } 1265 if (mp2) { 1266 LastDir = hwnd; 1267 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID); 1268 if (fSwitchTreeOnFocus && hwndTree && dcd && *dcd->directory) 1269 WinSendMsg(hwndTree, UM_SHOWME, MPFROMP(dcd->directory), MPVOID); 1270 } 1271 break; 1272 1273 case UM_SETDIR: 1274 if (dcd && mp1) { 1275 1276 CHAR fullname[CCHMAXPATH]; 1277 1278 DosError(FERR_DISABLEHARDERR); 1279 if (!DosQueryPathInfo((CHAR *) mp1, 1280 FIL_QUERYFULLNAME, fullname, sizeof(fullname))) { 1281 if (stricmp(dcd->directory, fullname)) { 1282 strcpy(dcd->previous, dcd->directory); 1283 strcpy(dcd->directory, fullname); 1284 DosEnterCritSec(); 1285 dcd->stopflag++; 1286 DosExitCritSec(); 1287 if (!PostMsg(dcd->hwndObject, UM_RESCAN, MPVOID, MPFROMLONG(1L))) { 1288 strcpy(dcd->directory, dcd->previous); 1289 DosEnterCritSec(); 1290 dcd->stopflag--; 1291 DosExitCritSec(); 1292 } 1293 else if (*dcd->directory) { 1294 if (hwndMain) 1295 WinSendMsg(hwndMain, 1296 UM_SETUSERLISTNAME, MPFROMP(dcd->directory), MPVOID); 1297 else 1298 add_udir(FALSE, dcd->directory); 1299 } 1300 } 1301 } 1302 } 1303 break; 1304 1305 case UM_RESCAN: 1306 if (dcd) { 1307 1308 CNRINFO cnri; 1309 CHAR s[CCHMAXPATH * 2], tf[81], tb[81]; 1310 PCNRITEM pci; 1311 1312 memset(&cnri, 0, sizeof(CNRINFO)); 1313 cnri.cb = sizeof(CNRINFO); 1314 WinSendMsg(hwnd, 1315 CM_QUERYCNRINFO, 1316 MPFROMP(&cnri), MPFROMLONG(sizeof(CNRINFO))); 1317 cnri.pszCnrTitle = dcd->directory; 1318 WinSendMsg(hwnd, 1319 CM_SETCNRINFO, MPFROMP(&cnri), MPFROMLONG(CMA_CNRTITLE)); 1320 dcd->totalfiles = cnri.cRecords; 1321 commafmt(tb, sizeof(tb), dcd->totalfiles); 1322 CommaFmtULL(tf, sizeof(tf), dcd->ullTotalBytes, 'K'); 1323 sprintf(s, "%s / %s", tb, tf); 1324 WinSetDlgItemText(dcd->hwndClient, DIR_TOTALS, s); 1325 commafmt(tb, sizeof(tb), dcd->selectedfiles); 1326 CommaFmtULL(tf, sizeof(tf), dcd->selectedbytes, 'K'); 1327 sprintf(s, "%s / %s", tb, tf); 1328 WinSetDlgItemText(dcd->hwndClient, DIR_SELECTED, s); 1329 if (hwndStatus && 1330 dcd->hwndFrame == WinQueryActiveWindow(dcd->hwndParent)) { 1331 PostMsg(dcd->hwndObject, UM_RESCAN2, MPVOID, MPVOID); 1332 if ((fSplitStatus && hwndStatus2) || fMoreButtons) { 1333 pci = WinSendMsg(hwnd, 1334 CM_QUERYRECORDEMPHASIS, 1335 MPFROMLONG(CMA_FIRST), MPFROMSHORT(CRA_CURSORED)); 1336 if (pci && (INT) pci != -1) { 1337 if (fSplitStatus && hwndStatus2) { 1338 CommaFmtULL(tb, sizeof(tb), pci->cbFile + pci->easize, ' '); 1339 if (!fMoreButtons) 1340 sprintf(s, 1341 " %s %04u/%02u/%02u %02u:%02u:%02u [%s] %s", 1342 tb, 1343 pci->date.year, 1344 pci->date.month, 1345 pci->date.day, 1346 pci->time.hours, 1347 pci->time.minutes, 1348 pci->time.seconds, 1349 pci->pszDispAttr, pci->pszFileName); 1350 else { 1351 *tf = 0; 1352 if (pci->cbFile + pci->easize > 1024) { 1353 CommaFmtULL(tf, sizeof(tf), pci->cbFile + pci->easize, 'K'); 1354 } 1355 sprintf(s, 1356 GetPString(IDS_STATUSSIZETEXT), 1357 tb, *tf ? " (" : NullStr, tf, *tf ? ")" : NullStr); 1358 } 1359 WinSetWindowText(hwndStatus2, s); 1360 } 1361 else 1362 WinSetWindowText(hwndStatus2, NullStr); 1363 if (fMoreButtons) { 1364 WinSetWindowText(hwndName, pci->pszFileName); 1365 sprintf(s, 1366 "%04u/%02u/%02u %02u:%02u:%02u", 1367 pci->date.year, 1368 pci->date.month, 1369 pci->date.day, 1370 pci->time.hours, pci->time.minutes, pci->time.seconds); 1371 WinSetWindowText(hwndDate, s); 1372 WinSetWindowText(hwndAttr, pci->pszDispAttr); 1373 } 1374 } 1375 else { 1376 WinSetWindowText(hwndStatus2, NullStr); 1377 WinSetWindowText(hwndName, NullStr); 1378 WinSetWindowText(hwndDate, NullStr); 1379 WinSetWindowText(hwndAttr, NullStr); 1380 } 1381 } 1382 } 1383 } 1384 return 0; 1385 1386 case UM_SORTRECORD: 1387 if (dcd) { 1388 1389 CNRINFO cnri; 1390 1391 memset(&cnri, 0, sizeof(CNRINFO)); 1392 cnri.cb = sizeof(CNRINFO); 1393 WinSendMsg(hwnd, 1394 CM_QUERYCNRINFO, 1395 MPFROMP(&cnri), MPFROMLONG(sizeof(CNRINFO))); 1396 cnri.pSortRecord = (PVOID) SortDirCnr; 1397 WinSendMsg(hwnd, 1398 CM_SETCNRINFO, MPFROMP(&cnri), MPFROMLONG(CMA_PSORTRECORD)); 1399 WinSendMsg(hwnd, 1400 CM_SORTRECORD, 1401 MPFROMP(SortDirCnr), MPFROMLONG(dcd->sortFlags)); 1402 } 1403 return 0; 1404 1405 case UM_SETUP: 1406 if (dcd) { 1407 if (!dcd->hwndObject) { 1408 /* 1409 * first time through -- set things up 1410 */ 1411 1412 CNRINFO cnri; 1413 1414 RestorePresParams(hwnd, "DirCnr"); 1415 LoadDetailsSwitches("DirCnr", dcd); 1416 memset(&cnri, 0, sizeof(CNRINFO)); 1417 cnri.cb = sizeof(CNRINFO); 1418 WinSendMsg(hwnd, 1419 CM_QUERYCNRINFO, 1420 MPFROMP(&cnri), MPFROMLONG(sizeof(CNRINFO))); 1421 cnri.cyLineSpacing = 0; 1422 cnri.cxTreeIndent = 12L; 1423 1424 cnri.flWindowAttr &= (~(CV_TREE | CV_ICON | CV_DETAIL | CV_TEXT)); 1425 cnri.flWindowAttr |= (CV_NAME | CA_DETAILSVIEWTITLES | CV_MINI | 1426 CV_FLOW); 1427 cnri.pSortRecord = (PVOID) SortDirCnr; 1428 1429 { 1430 ULONG size = sizeof(ULONG); 1431 1432 PrfQueryProfileData(fmprof, 1433 appname, 1434 "DirflWindowAttr", 1435 (PVOID) & cnri.flWindowAttr, &size); 1436 size = sizeof(MASK); 1437 if (!*dcd->mask.szMask && 1438 !dcd->mask.attrFile && !dcd->mask.antiattr) { 1439 if (PrfQueryProfileSize(fmprof, 1440 appname, "DirFilter", &size) && size) { 1441 PrfQueryProfileData(fmprof, 1442 appname, "DirFilter", &dcd->mask, &size); 1443 SetMask(dcd->mask.szMask, &dcd->mask); 1444 } 1445 else 1446 dcd->mask.attrFile = (FILE_READONLY | FILE_NORMAL | 1447 FILE_ARCHIVED | FILE_DIRECTORY | 1448 FILE_HIDDEN | FILE_SYSTEM); 1449 } 1450 *(dcd->mask.prompt) = 0; 1451 } 1452 if (dcd->flWindowAttr) 1453 cnri.flWindowAttr = dcd->flWindowAttr; 1454 else 1455 dcd->flWindowAttr = cnri.flWindowAttr; 1456 cnri.flWindowAttr &= (~(CA_MIXEDTARGETEMPH | CA_ORDEREDTARGETEMPH | 1457 CA_TITLEREADONLY | CA_TITLESEPARATOR)); 1458 cnri.flWindowAttr |= CV_FLOW; 1459 dcd->flWindowAttr |= CV_FLOW; 1460 if (WinWindowFromID(dcd->hwndFrame, FID_TITLEBAR)) 1461 cnri.flWindowAttr &= (~CA_CONTAINERTITLE); 1462 else 1463 cnri.flWindowAttr |= CA_CONTAINERTITLE; 1464 if (!dcd->sortFlags) 1465 dcd->sortFlags = sortFlags; 1466 WinSendMsg(hwnd, 1467 CM_SETCNRINFO, 1468 MPFROMP(&cnri), 1469 MPFROMLONG(CMA_FLWINDOWATTR | CMA_LINESPACING | 1470 CMA_CXTREEINDENT | CMA_PSORTRECORD)); 1471 SetCnrCols(hwnd, FALSE); 1472 AdjustCnrColsForPref(hwnd, NULL, dcd, FALSE); 1473 if (_beginthread(MakeObjWin, NULL, 245760, (PVOID) dcd) == -1) { 1474 Runtime_Error(pszSrcFile, __LINE__, 1475 GetPString(IDS_COULDNTSTARTTHREADTEXT)); 1476 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID); 1477 return 0; 1478 } 1479 else 1480 DosSleep(64L); 1481 WinEnableMenuItem(DirCnrMenu, IDM_FINDINTREE, (hwndTree != (HWND) 0)); 1482 } 1483 SayFilter(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT), 1484 DIR_FILTER), &dcd->mask, FALSE); 1485 SaySort(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT), 1486 DIR_SORT), dcd->sortFlags, FALSE); 1487 SayView(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT), 1488 DIR_VIEW), dcd->flWindowAttr); 1489 } 1490 else { 1491 PostMsg(hwnd, WM_CLOSE, MPVOID, MPVOID); 685 1492 return 0; 686 687 case UM_SETUP: 688 dcd = WinQueryWindowPtr(hwnd,QWL_USER); 689 if(dcd) { 690 /* set unique id */ 691 WinSetWindowUShort(hwnd, 692 QWS_ID, 693 DIROBJ_FRAME + (DIR_FRAME - dcd->id)); 694 dcd->hwndObject = hwnd; 695 if(ParentIsDesktop(hwnd,dcd->hwndParent)) 696 DosSleep(250L); 1493 } 1494 return 0; 1495 1496 case WM_MENUEND: 1497 if (dcd) { 1498 1499 HWND hwndMenu = (HWND) mp2; 1500 1501 if (hwndMenu == DirCnrMenu || 1502 hwndMenu == FileMenu || hwndMenu == DirMenu) { 1503 MarkAll(hwnd, TRUE, FALSE, TRUE); 1504 if (dcd->cnremphasized) { 1505 WinSendMsg(hwnd, CM_SETRECORDEMPHASIS, MPVOID, 1506 MPFROM2SHORT(FALSE, CRA_SOURCE)); 1507 dcd->cnremphasized = FALSE; 1508 } 1509 } 1510 } 1511 break; 1512 1513 case UM_OPENWINDOWFORME: 1514 if (dcd) { 1515 if (mp1 && !IsFile((CHAR *) mp1)) { 1516 OpenDirCnr(hwnd, dcd->hwndParent, dcd->hwndFrame, FALSE, (char *)mp1); 1517 } 1518 else if (mp1 && IsFile(mp1) == 1) { 1519 StartArcCnr(HWND_DESKTOP, 1520 dcd->hwndFrame, (CHAR *) mp1, 4, (ARC_TYPE *) mp2); 1521 } 1522 } 1523 return 0; 1524 1525 case MM_PORTHOLEINIT: 1526 if (dcd) { 1527 switch (SHORT1FROMMP(mp1)) { 1528 case 0: 1529 case 1: 1530 { 1531 ULONG wmsg; 1532 1533 wmsg = (SHORT1FROMMP(mp1) == 0) ? UM_FILESMENU : UM_VIEWSMENU; 1534 PortholeInit((HWND) WinSendMsg(dcd->hwndClient, 1535 wmsg, MPVOID, MPVOID), mp1, mp2); 1536 } 1537 break; 1538 } 1539 } 1540 break; 1541 1542 case UM_INITMENU: 1543 case WM_INITMENU: 1544 if (dcd) { 1545 switch (SHORT1FROMMP(mp1)) { 1546 case IDM_FILESMENU: 1547 if (isalpha(*dcd->directory)) { 1548 if (driveflags[toupper(*dcd->directory) - 'A'] & DRIVE_NOTWRITEABLE) { 1549 WinEnableMenuItem((HWND) mp2, IDM_MOVEMENU, FALSE); 1550 WinEnableMenuItem((HWND) mp2, IDM_RENAME, FALSE); 1551 WinEnableMenuItem((HWND) mp2, IDM_MKDIR, FALSE); 1552 WinEnableMenuItem((HWND) mp2, IDM_UNDELETE, FALSE); 1553 WinEnableMenuItem((HWND) mp2, IDM_DELETESUBMENU, FALSE); 1554 WinEnableMenuItem((HWND) mp2, IDM_DELETE, FALSE); 1555 WinEnableMenuItem((HWND) mp2, IDM_EDIT, FALSE); 1556 WinEnableMenuItem((HWND) mp2, IDM_EDITTEXT, FALSE); 1557 WinEnableMenuItem((HWND) mp2, IDM_EDITBINARY, FALSE); 1558 WinEnableMenuItem((HWND) mp2, IDM_ATTRS, FALSE); 1559 } 1560 else { 1561 WinEnableMenuItem((HWND) mp2, IDM_MOVEMENU, TRUE); 1562 WinEnableMenuItem((HWND) mp2, IDM_RENAME, TRUE); 1563 WinEnableMenuItem((HWND) mp2, IDM_MKDIR, TRUE); 1564 WinEnableMenuItem((HWND) mp2, IDM_UNDELETE, TRUE); 1565 WinEnableMenuItem((HWND) mp2, IDM_DELETESUBMENU, TRUE); 1566 WinEnableMenuItem((HWND) mp2, IDM_DELETE, TRUE); 1567 WinEnableMenuItem((HWND) mp2, IDM_EDIT, TRUE); 1568 WinEnableMenuItem((HWND) mp2, IDM_EDITTEXT, TRUE); 1569 WinEnableMenuItem((HWND) mp2, IDM_EDITBINARY, TRUE); 1570 WinEnableMenuItem((HWND) mp2, IDM_ATTRS, TRUE); 1571 } 1572 } 1573 break; 1574 1575 case IDM_VIEWSMENU: 1576 SetViewMenu((HWND) mp2, dcd->flWindowAttr); 1577 WinEnableMenuItem((HWND) mp2, IDM_RESELECT, 1578 (dcd->lastselection != NULL)); 1579 if (isalpha(*dcd->directory)) { 1580 if (driveflags[toupper(*dcd->directory) - 'A'] & DRIVE_NOTWRITEABLE) 1581 WinEnableMenuItem((HWND) mp2, IDM_MKDIR, FALSE); 1582 else 1583 WinEnableMenuItem((HWND) mp2, IDM_MKDIR, TRUE); 1584 } 1585 WinEnableMenuItem((HWND) mp2, 1586 IDM_SELECTCOMPAREMENU, 1587 (CountDirCnrs(dcd->hwndParent) > 1)); 1588 break; 1589 1590 case IDM_DETAILSSETUP: 1591 SetDetailsSwitches((HWND) mp2, dcd); 1592 break; 1593 1594 case IDM_COMMANDSMENU: 1595 SetupCommandMenu((HWND) mp2, hwnd); 1596 break; 1597 1598 case IDM_SORTSUBMENU: 1599 SetSortChecks((HWND) mp2, dcd->sortFlags); 1600 break; 1601 1602 case IDM_WINDOWSMENU: 1603 SetupWinList((HWND) mp2, 1604 (hwndMain) ? hwndMain : (HWND) 0, dcd->hwndFrame); 1605 break; 1606 } 1607 dcd->hwndLastMenu = (HWND) mp2; 1608 } 1609 if (msg == WM_INITMENU) 1610 break; 1611 return 0; 1612 1613 case UM_FILTER: 1614 if (dcd) { 1615 1616 PCNRITEM pci; 1617 1618 if (mp1) { 1619 DosEnterCritSec(); 1620 SetMask((CHAR *) mp1, &dcd->mask); 1621 DosExitCritSec(); 1622 } 1623 dcd->suspendview = 1; 1624 WinSendMsg(hwnd, CM_FILTER, MPFROMP(Filter), MPFROMP(&dcd->mask)); 1625 dcd->suspendview = 0; 1626 if (fAutoView && hwndMain) { 1627 pci = WinSendMsg(hwnd, CM_QUERYRECORDEMPHASIS, 1628 MPFROMLONG(CMA_FIRST), MPFROMSHORT(CRA_CURSORED)); 1629 if (pci && (INT) pci != -1 && 1630 (!(driveflags[toupper(*pci->szFileName) - 'A'] & DRIVE_SLOW))) 1631 WinSendMsg(hwndMain, UM_LOADFILE, MPFROMP(pci->szFileName), MPVOID); 1632 else 1633 WinSendMsg(hwndMain, UM_LOADFILE, MPVOID, MPVOID); 1634 } 1635 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID); 1636 } 1637 return 0; 1638 1639 case UM_COMMAND: 1640 if (mp1) { 1641 if (dcd) { 1642 if (!PostMsg(dcd->hwndObject, UM_COMMAND, mp1, mp2)) { 1643 Runtime_Error(pszSrcFile, __LINE__, "PostMsg"); 1644 FreeListInfo((LISTINFO *) mp1); 1645 } 1646 else 1647 return (MRESULT) TRUE; 697 1648 } 698 1649 else 699 PostMsg(hwnd,WM_CLOSE,MPVOID,MPVOID); 700 return 0; 701 702 case UM_RESCAN2: 703 dcd = WinQueryWindowPtr(hwnd,QWL_USER); 704 if(dcd && dcd->hwndFrame == WinQueryActiveWindow(dcd->hwndParent)) { 705 706 FSALLOCATE fsa; 707 CHAR s[CCHMAXPATH * 2]; 708 CHAR tf[64]; 709 CHAR tb[64]; 710 CHAR szFree[64]; 711 712 DosError(FERR_DISABLEHARDERR); 713 if(!DosQueryFSInfo(toupper(*dcd->directory) - '@', 714 FSIL_ALLOC,&fsa,sizeof(FSALLOCATE))) 1650 FreeListInfo((LISTINFO *) mp1); 1651 } 1652 return 0; 1653 1654 case UM_NOTIFY: 1655 if (mp2) 1656 Notify((CHAR *) mp2); 1657 return 0; 1658 1659 case UM_DRIVECMD: 1660 if (mp1) 1661 WinSendMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_SWITCH, 0), mp1); 1662 return 0; 1663 1664 case WM_COMMAND: 1665 DosError(FERR_DISABLEHARDERR); 1666 if (dcd) { 1667 switch (SHORT1FROMMP(mp1)) { 1668 case IDM_SETTARGET: 1669 SetTargetDir(hwnd, FALSE); 1670 break; 1671 1672 case IDM_CREATE: 715 1673 { 716 CommaFmtULL(tb,sizeof(tb), 717 (ULONGLONG)fsa.cUnitAvail * (fsa.cSectorUnit * fsa.cbSector), 718 'K'); 719 sprintf(szFree," {%s %s}", 720 tb,GetPString(IDS_FREETEXT)); 721 } 722 else 723 *szFree = 0; 724 commafmt(tf,sizeof(tf),dcd->totalfiles); 725 CommaFmtULL(tb,sizeof(tb),dcd->ullTotalBytes,' '); 726 if (!fMoreButtons) 1674 STRINGINPARMS sip; 1675 CHAR filename[CCHMAXPATHCOMP]; 1676 1677 memset(&sip, 0, sizeof(sip)); 1678 sip.help = GetPString(IDS_CREATETEXT); 1679 sip.prompt = GetPString(IDS_CREATEPROMPTTEXT); 1680 sip.inputlen = CCHMAXPATHCOMP - (strlen(dcd->directory) - 1); 1681 strcpy(filename, "NEWFILE.TXT"); 1682 sip.ret = filename; 1683 sip.title = GetPString(IDS_CREATETITLETEXT); 1684 if (WinDlgBox(HWND_DESKTOP, hwnd, InputDlgProc, FM3ModHandle, 1685 STR_FRAME, &sip)) { 1686 bstrip(sip.ret); 1687 if (*sip.ret) { 1688 CHAR newfile[CCHMAXPATH]; 1689 FILE *fp; 1690 INT test; 1691 PCNRITEM pci; 1692 1693 strcpy(newfile, dcd->directory); 1694 if (newfile[strlen(newfile) - 1] != '\\') 1695 strcat(newfile, "\\"); 1696 strcat(newfile, sip.ret); 1697 test = IsFile(newfile); 1698 if (test != 1) 1699 fp = fopen(newfile, "w"); 1700 if (test != 1 && !fp) { 1701 saymsg(MB_ENTER, 1702 hwnd, 1703 GetPString(IDS_ERRORTEXT), 1704 GetPString(IDS_CREATEERRORTEXT), newfile); 1705 } 1706 else { 1707 if (fp) { 1708 WinSendMsg(hwnd, UM_UPDATERECORD, MPFROMP(newfile), MPVOID); 1709 fclose(fp); 1710 } 1711 if (*editor) { 1712 1713 CHAR *dummy[2]; 1714 1715 dummy[0] = newfile; 1716 dummy[1] = NULL; 1717 ExecOnList(hwnd, 1718 editor, WINDOWED | SEPARATE, NULL, dummy, NULL); 1719 } 1720 else 1721 StartMLEEditor(dcd->hwndParent, 4, newfile, dcd->hwndFrame); 1722 pci = FindCnrRecord(hwnd, newfile, NULL, TRUE, FALSE, TRUE); 1723 if (pci && (INT) pci != -1) 1724 /* make sure that record shows in viewport */ 1725 ShowCnrRecord(hwnd, (PMINIRECORDCORE) pci); 1726 } 1727 } 1728 } 1729 } 1730 break; 1731 1732 case IDM_CONTEXTMENU: 727 1733 { 728 sprintf(s," [%s / %s]%s%s%s%s %s", 729 tf,tb,szFree, 730 (*dcd->mask.szMask || dcd->mask.antiattr || 731 dcd->mask.attrFile != ALLATTRS) ? " (" : NullStr, 732 (*dcd->mask.szMask) ? dcd->mask.szMask : 733 (dcd->mask.antiattr || 734 dcd->mask.attrFile != ALLATTRS) ? 735 GetPString(IDS_ALLTEXT) : NullStr, 736 (*dcd->mask.szMask || dcd->mask.antiattr || 737 dcd->mask.attrFile != ALLATTRS) ? ")" : NullStr, 738 dcd->directory); 739 } 740 else 1734 PCNRITEM pci; 1735 1736 pci = (PCNRITEM) CurrentRecord(hwnd); 1737 PostMsg(hwnd, WM_CONTROL, MPFROM2SHORT(DIR_CNR, CN_CONTEXTMENU), 1738 MPFROMP(pci)); 1739 } 1740 break; 1741 1742 case IDM_MAXIMIZE: 1743 PostMsg(hwndMain, UM_MAXIMIZE, MPFROMLONG(dcd->hwndFrame), MPVOID); 1744 break; 1745 1746 case IDM_SHOWALLFILESCNR: 1747 StartSeeAll(HWND_DESKTOP, FALSE, dcd->directory); 1748 break; 1749 1750 case IDM_SHOWALLFILES: 741 1751 { 742 sprintf(s," [%s / %s]%s %s", 743 tf,tb,szFree,dcd->directory); 744 } 745 if (dcd->hwndFrame == WinQueryActiveWindow(dcd->hwndParent)) 746 WinSetWindowText(hwndStatus,s); 747 } 748 return 0; 749 750 case UM_FLESH: 751 dcd = WinQueryWindowPtr(hwnd,QWL_USER); 752 if(dcd) { 753 754 PCNRITEM pci,pciC; 755 756 pci = WinSendMsg(dcd->hwndCnr, 757 CM_QUERYRECORD, 758 MPVOID, 759 MPFROM2SHORT(CMA_FIRST,CMA_ITEMORDER)); 760 while(pci && (INT)pci != -1) { 761 if(pci->attrFile & FILE_DIRECTORY) { 762 pciC = WinSendMsg(dcd->hwndCnr, 763 CM_QUERYRECORD, 764 MPFROMP(pci), 765 MPFROM2SHORT(CMA_FIRSTCHILD,CMA_ITEMORDER)); 766 if(!pciC) { 767 Stubby(dcd->hwndCnr,pci); 768 DosSleep(0L); 769 } 770 } 771 pci = WinSendMsg(dcd->hwndCnr, 772 CM_QUERYRECORD, 773 MPFROMP(pci), 774 MPFROM2SHORT(CMA_NEXT,CMA_ITEMORDER)); 775 } 776 dcd->firsttree = TRUE; 777 } 778 return 0; 779 780 case UM_RESCAN: 781 /* 782 * populate container 783 */ 784 dcd = WinQueryWindowPtr(hwnd,QWL_USER); 785 if (dcd) { 786 DosEnterCritSec(); 787 if (dcd->stopflag) 788 dcd->stopflag--; 789 if (dcd->stopflag) { 790 DosExitCritSec(); 791 return 0; 792 } 793 DosExitCritSec(); 794 if(mp1) { 795 strcpy(dcd->previous,dcd->directory); 796 strcpy(dcd->directory,(CHAR *)mp1); 797 } 798 MakeValidDir(dcd->directory); 799 { 800 CHAR s[CCHMAXPATH + 8]; 801 802 sprintf(s, 803 "%s%s%s", 804 (ParentIsDesktop(dcd->hwndFrame,(HWND)0)) ? 805 "VDir" : 806 NullStr, 807 (ParentIsDesktop(dcd->hwndFrame,(HWND)0)) ? 808 (!dcd->dontclose) ? 809 " Master: " : 810 ": " : 811 NullStr, 812 dcd->directory); 813 WinSetWindowText(dcd->hwndFrame, 814 s); 815 WinSetWindowText(WinWindowFromID(dcd->hwndFrame,FID_TITLEBAR), 816 s); 817 } 818 WinSendMsg(dcd->hwndCnr, 819 CM_REMOVERECORD, 820 MPVOID, 821 MPFROM2SHORT(0,CMA_FREE | CMA_INVALIDATE | CMA_ERASE)); 822 AdjustCnrColsForFSType(dcd->hwndCnr, 823 dcd->directory, 824 dcd); 825 dcd->ullTotalBytes = dcd->totalfiles = 826 dcd->selectedfiles = dcd->selectedbytes = 0; 827 WinSetDlgItemText(dcd->hwndClient, 828 DIR_TOTALS, 829 "0 / 0k"); 830 WinSetDlgItemText(dcd->hwndClient, 831 DIR_SELECTED, 832 "0 / 0k"); 833 if(hwndStatus && 834 dcd->hwndFrame == WinQueryActiveWindow(dcd->hwndParent)) { 835 WinSetWindowText(hwndStatus, 836 GetPString(IDS_SCANNINGTEXT)); 837 if(hwndMain) 838 WinSendMsg(hwndMain, 839 UM_LOADFILE, 840 MPVOID, 841 MPVOID); 842 } 843 if(fSwitchTree && hwndTree) { 844 if(hwndMain) { 845 if(TopWindow(hwndMain, 846 (HWND)0) == dcd->hwndFrame) 847 WinSendMsg(hwndTree, 848 UM_SHOWME, 849 MPFROMP(dcd->directory), 850 MPVOID); 851 } 852 else 853 WinSendMsg(hwndTree, 854 UM_SHOWME, 855 MPFROMP(dcd->directory), 856 MPVOID); 857 } 858 dcd->firsttree = FALSE; 859 // fixme to check errors 860 FillDirCnr(dcd->hwndCnr, 861 dcd->directory, 862 dcd, 863 &dcd->ullTotalBytes); 864 PostMsg(dcd->hwndCnr, 865 UM_RESCAN, 866 MPVOID, 867 MPVOID); 868 if(mp2 && 869 !fLeaveTree && 870 (dcd->flWindowAttr & CV_TREE)) { 871 872 ULONG flWindowAttr = dcd->flWindowAttr; 873 CNRINFO cnri; 874 875 flWindowAttr &= (~(CV_NAME | CV_TREE | CV_ICON | CV_DETAIL | CV_TEXT)); 876 if(dcd->lastattr) { 877 if(dcd->lastattr & CV_TEXT) 878 flWindowAttr |= CV_TEXT; 879 else if(dcd->lastattr & CV_DETAIL) 880 flWindowAttr |= CV_DETAIL; 881 else if(dcd->lastattr & CV_ICON) 882 flWindowAttr |= CV_ICON; 883 else 884 flWindowAttr |= CV_NAME; 885 } 886 else 887 flWindowAttr |= CV_NAME; 888 flWindowAttr |= CV_FLOW; 889 memset(&cnri,0,sizeof(CNRINFO)); 890 cnri.cb = sizeof(CNRINFO); 891 if(WinSendMsg(dcd->hwndCnr,CM_QUERYCNRINFO,MPFROMP(&cnri), 892 MPFROMLONG(sizeof(CNRINFO)))) { 893 dcd->flWindowAttr = cnri.flWindowAttr = flWindowAttr; 894 WinSendMsg(dcd->hwndCnr,CM_SETCNRINFO, 895 MPFROMP(&cnri), 896 MPFROMLONG(CMA_FLWINDOWATTR)); 897 SayView(WinWindowFromID(dcd->hwndClient, 898 DIR_VIEW),dcd->flWindowAttr); 899 } 900 } 901 if(dcd->flWindowAttr & CV_TREE) 902 PostMsg(dcd->hwndObject,UM_FLESH,MPVOID,MPVOID); 903 if(*dcd->previous) { 904 if(strlen(dcd->previous) > strlen(dcd->directory) && 905 !strnicmp(dcd->directory,dcd->previous,strlen(dcd->directory))) { 906 907 PCNRITEM pci; 908 909 pci = FindCnrRecord(dcd->hwndCnr, 910 dcd->previous, 911 NULL, 912 TRUE, 913 FALSE, 914 TRUE); 915 if(pci && (INT)pci != -1) { 916 /* make found item current (cursored) item */ 917 WinSendMsg(dcd->hwndCnr,CM_SETRECORDEMPHASIS,MPFROMP(pci), 918 MPFROM2SHORT(TRUE,CRA_CURSORED)); 919 /* make sure that record shows in viewport */ 920 ShowCnrRecord(dcd->hwndCnr,(PMINIRECORDCORE)pci); 921 } 922 } 923 } 924 } 925 return 0; 926 927 case UM_COMMAND: 928 if(mp1) { 929 930 LISTINFO *li = (LISTINFO *)mp1; 931 932 switch(li->type) { 933 case IDM_DOITYOURSELF: 934 case IDM_APPENDTOCLIP: 935 case IDM_SAVETOCLIP: 936 case IDM_ARCHIVE: 937 case IDM_ARCHIVEM: 938 case IDM_VIEWTEXT: 939 case IDM_VIEWBINARY: 940 case IDM_VIEWARCHIVE: 941 case IDM_VIEW: 942 case IDM_EDITTEXT: 943 case IDM_EDITBINARY: 944 case IDM_EDIT: 945 case IDM_OBJECT: 946 case IDM_SHADOW: 947 case IDM_SHADOW2: 948 case IDM_PRINT: 949 case IDM_ATTRS: 950 case IDM_DELETE: 951 case IDM_PERMDELETE: 952 case IDM_MCIPLAY: 953 case IDM_UPDATE: 954 if(PostMsg(hwnd,UM_MASSACTION,mp1,mp2)) 955 return (MRESULT)TRUE; 956 break; 957 default: 958 if(PostMsg(hwnd,UM_ACTION,mp1,mp2)) 959 return (MRESULT)TRUE; 960 } 961 } 962 return 0; 963 964 case UM_SELECT: 965 dcd = WinQueryWindowPtr(hwnd,QWL_USER); 966 if(dcd) { 967 switch(SHORT1FROMMP(mp1)) { 968 case IDM_SELECTBOTH: 969 case IDM_SELECTONE: 970 case IDM_SELECTMORE: 971 case IDM_SELECTNEWER: 972 case IDM_SELECTOLDER: 973 case IDM_SELECTBIGGER: 974 case IDM_SELECTSMALLER: 975 case IDM_DESELECTBOTH: 976 case IDM_DESELECTONE: 977 case IDM_DESELECTMORE: 978 case IDM_DESELECTNEWER: 979 case IDM_DESELECTOLDER: 980 case IDM_DESELECTBIGGER: 981 case IDM_DESELECTSMALLER: 982 SpecialSelect2(dcd->hwndParent,SHORT1FROMMP(mp1)); 983 break; 984 case IDM_SELECTLIST: 985 { 986 CHAR filename[CCHMAXPATH],*p,*pp; 987 ULONG size; 988 989 strcpy(filename,"*.LST"); 990 size = CCHMAXPATH; 991 PrfQueryProfileData(fmprof,appname,"SaveToListName", 992 filename,&size); 993 pp = strrchr(filename,'\\'); 994 if(!pp) 995 pp = filename; 996 p = strrchr(pp,'.'); 997 if(p && *(p + 1) && p > pp + 1) { 998 if(pp > filename) 999 pp++; 1000 *pp = '*'; 1001 pp++; 1002 if(p > pp) 1003 memmove(pp,p,strlen(p) + 1); 1004 } 1005 if(insert_filename(hwnd,filename,FALSE,FALSE)) 1006 SelectList(dcd->hwndCnr,TRUE,FALSE,FALSE,NULL,filename,NULL); 1007 } 1008 break; 1009 case IDM_SELECTALL: 1010 SelectAll(dcd->hwndCnr,TRUE,TRUE,NULL,NULL,FALSE); 1011 break; 1012 case IDM_DESELECTALL: 1013 DeselectAll(dcd->hwndCnr,TRUE,TRUE,NULL,NULL,FALSE); 1014 break; 1015 case IDM_SELECTALLFILES: 1016 SelectAll(dcd->hwndCnr,TRUE,FALSE,NULL,NULL,FALSE); 1017 break; 1018 case IDM_DESELECTALLFILES: 1019 DeselectAll(dcd->hwndCnr,TRUE,FALSE,NULL,NULL,FALSE); 1020 break; 1021 case IDM_SELECTALLDIRS: 1022 SelectAll(dcd->hwndCnr,FALSE,TRUE,NULL,NULL,FALSE); 1023 break; 1024 case IDM_DESELECTALLDIRS: 1025 DeselectAll(dcd->hwndCnr,FALSE,TRUE,NULL,NULL,FALSE); 1026 break; 1027 case IDM_DESELECTMASK: 1028 case IDM_SELECTMASK: 1029 { 1030 MASK mask; 1031 PCNRITEM pci = (PCNRITEM)mp2; 1032 1033 memset(&mask,0,sizeof(MASK)); 1034 mask.fNoAttribs = TRUE; 1035 mask.fNoDirs = TRUE; 1036 mask.fText = TRUE; 1037 strcpy(mask.prompt, 1038 GetPString((SHORT1FROMMP(mp1) == IDM_SELECTMASK) ? 1039 IDS_SELECTFILTERTEXT : 1040 IDS_DESELECTFILTERTEXT)); 1041 if(pci && (INT)pci != -1) 1042 strcpy(mask.szMask,pci->szFileName); 1043 if(WinDlgBox(HWND_DESKTOP, 1044 dcd->hwndCnr, 1045 PickMaskDlgProc, 1046 FM3ModHandle, 1047 MSK_FRAME, 1048 MPFROMP(&mask))) { 1049 if(SHORT1FROMMP(mp1) == IDM_SELECTMASK) 1050 SelectAll(dcd->hwndCnr, 1051 TRUE, 1052 TRUE, 1053 mask.szMask, 1054 mask.szText, 1055 FALSE); 1056 else 1057 DeselectAll(dcd->hwndCnr, 1058 TRUE, 1059 TRUE, 1060 mask.szMask, 1061 mask.szText, 1062 FALSE); 1063 } 1064 } 1065 break; 1066 1067 case IDM_DESELECTCLIP: 1068 case IDM_SELECTCLIP: 1069 { 1070 CHAR **list; 1071 1072 list = ListFromClipboard(hwnd); 1073 if(list) { 1074 SelectList(dcd->hwndCnr,TRUE,FALSE, 1075 (SHORT1FROMMP(mp1) == IDM_DESELECTCLIP), 1076 NULL,NULL,list); 1077 FreeList(list); 1078 } 1079 } 1080 break; 1081 1082 case IDM_INVERT: 1083 InvertAll(dcd->hwndCnr); 1084 break; 1085 } 1086 } 1087 return 0; 1088 1089 case UM_MASSACTION: 1090 if(mp1) { 1091 1092 dcd = WinQueryWindowPtr(hwnd,QWL_USER); 1093 if(dcd) { 1094 1095 WORKER *wk; 1096 1097 wk = xmallocz(sizeof(WORKER),pszSrcFile,__LINE__); 1098 if (!wk) 1099 FreeListInfo((LISTINFO *)mp1); 1752 PCNRITEM pci; 1753 1754 pci = WinSendMsg(hwnd, CM_QUERYRECORDEMPHASIS, 1755 MPFROMLONG(CMA_FIRST), MPFROMSHORT(CRA_CURSORED)); 1756 if (pci && (INT) pci != -1) { 1757 1758 static CHAR dirname[CCHMAXPATH]; 1759 1760 strcpy(dirname, pci->szFileName); 1761 MakeValidDir(dirname); 1762 StartSeeAll(HWND_DESKTOP, FALSE, dirname); 1763 } 1764 } 1765 break; 1766 1767 case IDM_FINDINTREE: 1768 if (hwndTree) 1769 WinSendMsg(hwndTree, UM_SHOWME, MPFROMP(dcd->directory), 1770 MPFROMLONG(1L)); 1771 break; 1772 1773 case IDM_BEGINEDIT: 1774 OpenEdit(hwnd); 1775 break; 1776 1777 case IDM_ENDEDIT: 1778 WinSendMsg(hwnd, CM_CLOSEEDIT, MPVOID, MPVOID); 1779 break; 1780 1781 case IDM_SHOWSELECT: 1782 QuickPopup(hwnd, 1783 dcd, 1784 CheckMenu(&DirCnrMenu, DIRCNR_POPUP), IDM_SELECTSUBMENU); 1785 break; 1786 1787 case IDM_SHOWSORT: 1788 QuickPopup(hwnd, dcd, CheckMenu(&DirCnrMenu, DIRCNR_POPUP), 1789 IDM_SORTSUBMENU); 1790 break; 1791 1792 case IDM_VIEWORARC: 1793 { 1794 SWP swp; 1795 PCNRITEM pci; 1796 1797 pci = (PCNRITEM) WinSendMsg(hwnd, CM_QUERYRECORDEMPHASIS, 1798 MPFROMLONG(CMA_FIRST), 1799 MPFROMSHORT(CRA_CURSORED)); 1800 if (pci && (INT) pci != -1) { 1801 WinQueryWindowPos(dcd->hwndFrame, &swp); 1802 DefaultViewKeys(hwnd, 1803 dcd->hwndFrame, 1804 dcd->hwndParent, &swp, pci->szFileName); 1805 } 1806 } 1807 break; 1808 1809 case IDM_NOTEBOOK: 1810 if (!ParentIsDesktop(dcd->hwndParent, dcd->hwndParent)) 1811 PostMsg(dcd->hwndParent, msg, mp1, mp2); 1812 else 1813 WinDlgBox(HWND_DESKTOP, hwnd, CfgDlgProc, FM3ModHandle, 1814 CFG_FRAME, (PVOID) "Directory"); 1815 break; 1816 1817 case IDM_QTREE: 1818 case IDM_TREE: 1819 { 1820 CHAR newpath[CCHMAXPATH]; 1821 APIRET rc; 1822 PCNRITEM pci; 1823 1824 if (SHORT1FROMMP(mp1) == IDM_TREE) { 1825 pci = (PCNRITEM) CurrentRecord(hwnd); 1826 if (pci && (INT) pci != -1) 1827 strcpy(newpath, pci->szFileName); 1828 else 1829 strcpy(newpath, dcd->directory); 1830 } 1831 else 1832 strcpy(newpath, dcd->directory); 1833 MakeValidDir(newpath); 1834 rc = WinDlgBox(HWND_DESKTOP, dcd->hwndClient, ObjCnrDlgProc, 1835 FM3ModHandle, QTREE_FRAME, MPFROMP(newpath)); 1836 if (rc) 1837 WinSendMsg(hwnd, UM_SETDIR, MPFROMP(newpath), MPVOID); 1838 } 1839 break; 1840 1841 case IDM_RESELECT: 1842 SelectList(hwnd, TRUE, FALSE, FALSE, NULL, NULL, dcd->lastselection); 1843 break; 1844 1845 case IDM_HELP: 1846 if (hwndHelp) { 1847 if (!ParentIsDesktop(dcd->hwndFrame, dcd->hwndParent)) 1848 PostMsg(dcd->hwndParent, UM_COMMAND, mp1, mp2); 1849 else 1850 WinSendMsg(hwndHelp, HM_HELP_CONTENTS, MPVOID, MPVOID); 1851 } 1852 break; 1853 1854 case IDM_WINDOWDLG: 1855 if (!ParentIsDesktop(dcd->hwndFrame, dcd->hwndParent)) 1856 PostMsg(dcd->hwndParent, UM_COMMAND, 1857 MPFROM2SHORT(IDM_WINDOWDLG, 0), MPVOID); 1858 break; 1859 1860 case IDM_SORTSMARTNAME: 1861 case IDM_SORTNAME: 1862 case IDM_SORTFILENAME: 1863 case IDM_SORTSIZE: 1864 case IDM_SORTEASIZE: 1865 case IDM_SORTFIRST: 1866 case IDM_SORTLAST: 1867 case IDM_SORTLWDATE: 1868 case IDM_SORTLADATE: 1869 case IDM_SORTCRDATE: 1870 case IDM_SORTSUBJECT: 1871 dcd->sortFlags &= (SORT_REVERSE | SORT_DIRSFIRST | SORT_DIRSLAST); 1872 case IDM_SORTDIRSFIRST: 1873 case IDM_SORTDIRSLAST: 1874 case IDM_SORTREVERSE: 1875 switch (SHORT1FROMMP(mp1)) { 1876 case IDM_SORTSUBJECT: 1877 dcd->sortFlags |= SORT_SUBJECT; 1878 break; 1879 case IDM_SORTSMARTNAME: 1880 case IDM_SORTFILENAME: 1881 dcd->sortFlags |= SORT_FILENAME; 1882 break; 1883 case IDM_SORTSIZE: 1884 dcd->sortFlags |= SORT_SIZE; 1885 break; 1886 case IDM_SORTEASIZE: 1887 dcd->sortFlags |= SORT_EASIZE; 1888 break; 1889 case IDM_SORTFIRST: 1890 dcd->sortFlags |= SORT_FIRSTEXTENSION; 1891 break; 1892 case IDM_SORTLAST: 1893 dcd->sortFlags |= SORT_LASTEXTENSION; 1894 break; 1895 case IDM_SORTLWDATE: 1896 dcd->sortFlags |= SORT_LWDATE; 1897 break; 1898 case IDM_SORTLADATE: 1899 dcd->sortFlags |= SORT_LADATE; 1900 break; 1901 case IDM_SORTCRDATE: 1902 dcd->sortFlags |= SORT_CRDATE; 1903 break; 1904 case IDM_SORTDIRSFIRST: 1905 if (dcd->sortFlags & SORT_DIRSFIRST) 1906 dcd->sortFlags &= (~SORT_DIRSFIRST); 1100 1907 else { 1101 wk->size = sizeof(WORKER); 1102 wk->hwndCnr = dcd->hwndCnr; 1103 wk->hwndParent = dcd->hwndParent; 1104 wk->hwndFrame = dcd->hwndFrame; 1105 wk->hwndClient = dcd->hwndClient; 1106 wk->li = (LISTINFO *)mp1; 1107 strcpy(wk->directory,dcd->directory); 1108 if(_beginthread(MassAction,NULL,122880,(PVOID)wk) == -1) { 1109 Runtime_Error(pszSrcFile, __LINE__, GetPString(IDS_COULDNTSTARTTHREADTEXT)); 1110 free(wk); 1111 FreeListInfo((LISTINFO *)mp1); 1112 } 1113 } 1114 } 1115 } 1116 return 0; 1117 1118 case UM_ACTION: 1119 if(mp1) { 1120 1121 dcd = WinQueryWindowPtr(hwnd,QWL_USER); 1122 if(dcd) { 1123 1124 WORKER *wk; 1125 1126 wk = xmallocz(sizeof(WORKER),pszSrcFile,__LINE__); 1127 if (!wk) 1128 FreeListInfo((LISTINFO *)mp1); 1908 dcd->sortFlags |= SORT_DIRSFIRST; 1909 dcd->sortFlags &= (~SORT_DIRSLAST); 1910 } 1911 break; 1912 case IDM_SORTDIRSLAST: 1913 if (dcd->sortFlags & SORT_DIRSLAST) 1914 dcd->sortFlags &= (~SORT_DIRSLAST); 1129 1915 else { 1130 wk->size = sizeof(WORKER); 1131 wk->hwndCnr = dcd->hwndCnr; 1132 wk->hwndParent = dcd->hwndParent; 1133 wk->hwndFrame = dcd->hwndFrame; 1134 wk->hwndClient = dcd->hwndClient; 1135 wk->li = (LISTINFO *)mp1; 1136 strcpy(wk->directory,dcd->directory); 1137 if(_beginthread(Action,NULL,122880,(PVOID)wk) == -1) { 1138 Runtime_Error(pszSrcFile, __LINE__, GetPString(IDS_COULDNTSTARTTHREADTEXT)); 1139 free(wk); 1140 FreeListInfo((LISTINFO *)mp1); 1141 } 1142 } 1143 } 1144 } 1145 return 0; 1146 1147 case WM_CLOSE: 1148 WinDestroyWindow(hwnd); 1149 break; 1150 1151 case WM_DESTROY: 1152 dcd = WinQueryWindowPtr(hwnd,QWL_USER); 1153 if(dcd) { 1154 if(dcd->hwndRestore) 1155 WinSetWindowPos(dcd->hwndRestore, 1156 HWND_TOP, 1157 0, 1158 0, 1159 0, 1160 0, 1161 SWP_RESTORE | SWP_SHOW | SWP_ACTIVATE | SWP_ZORDER); 1162 FreeList(dcd->lastselection); 1163 free(dcd); 1164 DosPostEventSem(CompactSem); 1165 } 1166 if(!PostMsg((HWND)0, 1167 WM_QUIT, 1168 MPVOID, 1169 MPVOID)) 1170 WinSendMsg((HWND)0, 1171 WM_QUIT, 1172 MPVOID, 1173 MPVOID); 1174 break; 1175 } 1176 return WinDefWindowProc(hwnd,msg,mp1,mp2); 1177 } 1178 1179 1180 MRESULT EXPENTRY DirCnrWndProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2) 1181 { 1182 DIRCNRDATA *dcd = WinQueryWindowPtr(hwnd,QWL_USER); 1183 1184 switch(msg) { 1185 case DM_PRINTOBJECT: 1186 return MRFROMLONG(DRR_TARGET); 1187 1188 case DM_DISCARDOBJECT: 1189 if (dcd) 1190 return WinSendMsg(dcd->hwndObject,msg,mp1,mp2); 1191 else 1192 return MRFROMLONG(DRR_TARGET); 1193 1194 case WM_CHAR: 1195 shiftstate = (SHORT1FROMMP(mp1) & (KC_SHIFT | KC_ALT | KC_CTRL)); 1196 if (SHORT1FROMMP(mp1) & KC_KEYUP) 1197 return (MRESULT)TRUE; 1198 if (SHORT1FROMMP(mp1) & KC_VIRTUALKEY) { 1199 switch(SHORT2FROMMP(mp2)) { 1200 case VK_INSERT: 1201 if ((shiftstate & KC_CTRL) == KC_CTRL) 1202 PostMsg(hwnd, 1203 WM_COMMAND, 1204 MPFROM2SHORT(IDM_MKDIR,0), 1205 MPVOID); 1206 else if ((shiftstate & KC_ALT) == KC_ALT) 1207 PostMsg(hwnd, 1208 WM_COMMAND, 1209 MPFROM2SHORT(IDM_CREATE,0), 1210 MPVOID); 1211 break; 1212 case VK_PAGEUP: 1213 if ((shiftstate & KC_CTRL) == KC_CTRL) 1214 PostMsg(hwnd, 1215 WM_COMMAND, 1216 MPFROM2SHORT(IDM_PARENT,0), 1217 MPVOID); 1218 break; 1219 case VK_PAGEDOWN: 1220 if ((shiftstate & KC_CTRL) == KC_CTRL) 1221 PostMsg(hwnd, 1222 WM_COMMAND, 1223 MPFROM2SHORT(IDM_PREVIOUS,0), 1224 MPVOID); 1225 break; 1226 case VK_HOME: 1227 if ((shiftstate & KC_CTRL) == KC_CTRL && dcd) { 1228 1229 CHAR s[CCHMAXPATH],*p; 1230 1231 strcpy(s,dcd->directory); 1232 p = strchr(s,'\\'); 1233 if (p) { 1234 p++; 1235 *p = 0; 1236 WinSendMsg(hwnd, 1237 UM_SETDIR, 1238 MPFROMP(s), 1239 MPVOID); 1240 } 1241 } 1242 break; 1243 case VK_DELETE: 1244 if ((shiftstate & KC_CTRL) == KC_CTRL) 1245 PostMsg(hwnd,WM_COMMAND,MPFROM2SHORT(IDM_PERMDELETE,0),MPVOID); 1246 else if ((shiftstate & KC_SHIFT) == KC_SHIFT) 1247 PostMsg(hwnd,WM_COMMAND,MPFROM2SHORT(IDM_SAVETOCLIP,0),MPVOID); 1248 else 1249 PostMsg(hwnd,WM_COMMAND,MPFROM2SHORT(IDM_DELETE,0),MPVOID); 1250 break; 1251 } 1252 } 1253 if (shiftstate || fNoSearch) 1254 break; 1255 if (SHORT1FROMMP(mp1) & KC_CHAR) { 1256 1257 ULONG thistime,len; 1258 SEARCHSTRING srch; 1259 PCNRITEM pci; 1260 1261 if (!dcd) 1262 break; 1263 switch(SHORT1FROMMP(mp2)) { 1264 case '\x1b': 1265 case '\r': 1266 case '\n': 1267 dcd->lasttime = 0; 1268 *dcd->szCommonName = 0; 1269 break; 1270 default: 1271 thistime = WinQueryMsgTime(WinQueryAnchorBlock(hwnd)); 1272 if (thistime > dcd->lasttime + 1250) 1273 *dcd->szCommonName = 0; 1274 dcd->lasttime = thistime; 1275 if (SHORT1FROMMP(mp2) == ' ' && !dcd->szCommonName) 1276 break; 1277 KbdRetry: 1278 len = strlen(dcd->szCommonName); 1279 if (len >= CCHMAXPATH - 1) { 1280 *dcd->szCommonName = 0; 1281 len = 0; 1282 } 1283 dcd->szCommonName[len] = toupper(SHORT1FROMMP(mp2)); 1284 dcd->szCommonName[len + 1] = 0; 1285 memset(&srch,0,sizeof(SEARCHSTRING)); 1286 srch.cb = (ULONG)sizeof(SEARCHSTRING); 1287 srch.pszSearch = (PSZ)dcd->szCommonName; 1288 srch.fsPrefix = TRUE; 1289 srch.fsCaseSensitive = FALSE; 1290 srch.usView = CV_ICON; 1291 pci = WinSendMsg(hwnd,CM_SEARCHSTRING,MPFROMP(&srch), 1292 MPFROMLONG(CMA_FIRST)); 1293 if (pci && (INT)pci != -1) { 1294 1295 USHORT attrib = CRA_CURSORED; 1296 1297 /* make found item current item */ 1298 if (!stricmp(pci->pszFileName,dcd->szCommonName)) 1299 attrib |= CRA_SELECTED; 1300 WinSendMsg(hwnd,CM_SETRECORDEMPHASIS,MPFROMP(pci), 1301 MPFROM2SHORT(TRUE,attrib)); 1302 /* make sure that record shows in viewport */ 1303 ShowCnrRecord(hwnd,(PMINIRECORDCORE)pci); 1304 return (MRESULT)TRUE; 1305 } 1306 else { 1307 if (SHORT1FROMMP(mp2) == ' ') { 1308 dcd->szCommonName[len] = 0; 1309 break; 1310 } 1311 *dcd->szCommonName = 0; 1312 dcd->lasttime = 0; 1313 if (len) // retry as first letter if no match 1314 goto KbdRetry; 1315 } 1316 break; 1317 } 1318 } 1319 break; 1320 1321 case WM_MOUSEMOVE: 1322 case WM_BUTTON1UP: 1323 case WM_BUTTON2UP: 1324 case WM_BUTTON3UP: 1325 case WM_CHORD: 1326 shiftstate = (SHORT2FROMMP(mp2) & (KC_ALT | KC_SHIFT | KC_CTRL)); 1327 break; 1328 1329 case WM_BUTTON1MOTIONEND: 1330 { 1331 CNRINFO cnri; 1332 1333 memset(&cnri,0,sizeof(CNRINFO)); 1334 cnri.cb = sizeof(CNRINFO); 1335 if (WinSendMsg(hwnd,CM_QUERYCNRINFO,MPFROMP(&cnri), 1336 MPFROMLONG(sizeof(CNRINFO)))) { 1337 if (cnri.flWindowAttr & CV_DETAIL) 1338 PrfWriteProfileData(fmprof,appname,"CnrSplitBar", 1339 (PVOID)&cnri.xVertSplitbar,sizeof(LONG)); 1340 } 1341 } 1342 break; 1343 1344 case UM_COMPARE: 1345 if (dcd && mp1 && mp2) { 1346 1347 COMPARE *cmp; 1348 CHAR *leftdir = (CHAR *)mp1,*rightdir = (CHAR *)mp2; 1349 1350 if (!IsFile(leftdir) && 1351 !IsFile(rightdir)) { 1352 cmp = xmallocz(sizeof(COMPARE),pszSrcFile,__LINE__); 1353 if (cmp) { 1354 cmp->size = sizeof(COMPARE); 1355 strcpy(cmp->leftdir,leftdir); 1356 strcpy(cmp->rightdir,rightdir); 1357 cmp->hwndParent = dcd->hwndParent; 1358 cmp->dcd.hwndParent = dcd->hwndParent; 1359 WinDlgBox(HWND_DESKTOP, 1360 HWND_DESKTOP, 1361 CompareDlgProc, 1362 FM3ModHandle, 1363 COMP_FRAME, 1364 MPFROMP(cmp)); 1365 } 1366 } 1367 } 1368 return 0; 1369 1370 case WM_PRESPARAMCHANGED: 1371 PresParamChanged(hwnd, 1372 "DirCnr", 1373 mp1, 1374 mp2); 1375 break; 1376 1377 case UM_UPDATERECORDLIST: 1378 if (dcd && mp1) 1379 WinSendMsg(dcd->hwndObject, 1380 msg, 1381 mp1, 1382 mp2); 1383 return 0; 1384 1385 case UM_UPDATERECORD: 1386 if (dcd && mp1) { 1387 1388 CHAR *filename; 1389 1390 filename = mp1; 1391 if (filename) 1392 UpdateCnrRecord(hwnd, 1393 filename, 1394 TRUE, 1395 dcd); 1396 } 1397 return 0; 1398 1399 case WM_SETFOCUS: 1400 /* 1401 * put name of our window (directory name) on status line 1402 */ 1403 if (dcd && hwndStatus && mp2) { 1404 1405 PCNRITEM pci = NULL; 1406 1407 if (fAutoView && hwndMain) { 1408 pci = WinSendMsg(hwnd,CM_QUERYRECORDEMPHASIS,MPFROMLONG(CMA_FIRST), 1409 MPFROMSHORT(CRA_CURSORED)); 1410 if (pci && (INT)pci != -1 && 1411 (!(driveflags[toupper(*pci->szFileName) - 'A'] & DRIVE_SLOW))) 1412 WinSendMsg(hwndMain, 1413 UM_LOADFILE, 1414 MPFROMP(pci->szFileName), 1415 MPVOID); 1416 else 1417 WinSendMsg(hwndMain, 1418 UM_LOADFILE, 1419 MPVOID, 1420 MPVOID); 1421 } 1422 if (*dcd->directory) { 1423 if (hwndMain) 1424 WinSendMsg(hwndMain, 1425 UM_SETUSERLISTNAME, 1426 MPFROMP(dcd->directory), 1427 MPVOID); 1428 else 1429 add_udir(FALSE,dcd->directory); 1430 } 1431 if (hwndMain) 1432 PostMsg(hwndMain, 1433 UM_ADVISEFOCUS, 1434 MPFROMLONG(dcd->hwndFrame), 1435 MPVOID); 1436 } 1437 if (mp2) { 1438 LastDir = hwnd; 1439 PostMsg(hwnd, 1440 UM_RESCAN, 1441 MPVOID, 1442 MPVOID); 1443 if (fSwitchTreeOnFocus && 1444 hwndTree && 1445 dcd && 1446 *dcd->directory) 1447 WinSendMsg(hwndTree, 1448 UM_SHOWME, 1449 MPFROMP(dcd->directory), 1450 MPVOID); 1451 } 1452 break; 1453 1454 case UM_SETDIR: 1455 if (dcd && mp1) { 1456 1457 CHAR fullname[CCHMAXPATH]; 1458 1459 DosError(FERR_DISABLEHARDERR); 1460 if (!DosQueryPathInfo((CHAR *)mp1, 1461 FIL_QUERYFULLNAME, 1462 fullname, 1463 sizeof(fullname))) { 1464 if (stricmp(dcd->directory,fullname)) { 1465 strcpy(dcd->previous,dcd->directory); 1466 strcpy(dcd->directory,fullname); 1467 DosEnterCritSec(); 1468 dcd->stopflag++; 1469 DosExitCritSec(); 1470 if (!PostMsg(dcd->hwndObject, 1471 UM_RESCAN, 1472 MPVOID, 1473 MPFROMLONG(1L))) { 1474 strcpy(dcd->directory,dcd->previous); 1475 DosEnterCritSec(); 1476 dcd->stopflag--; 1477 DosExitCritSec(); 1478 } 1479 else if (*dcd->directory) { 1480 if (hwndMain) 1481 WinSendMsg(hwndMain, 1482 UM_SETUSERLISTNAME, 1483 MPFROMP(dcd->directory), 1484 MPVOID); 1485 else 1486 add_udir(FALSE, 1487 dcd->directory); 1488 } 1489 } 1490 } 1491 } 1492 break; 1493 1494 case UM_RESCAN: 1495 if (dcd) { 1496 1497 CNRINFO cnri; 1498 CHAR s[CCHMAXPATH * 2],tf[81],tb[81]; 1499 PCNRITEM pci; 1500 1501 memset(&cnri,0,sizeof(CNRINFO)); 1502 cnri.cb = sizeof(CNRINFO); 1503 WinSendMsg(hwnd, 1504 CM_QUERYCNRINFO, 1505 MPFROMP(&cnri), 1506 MPFROMLONG(sizeof(CNRINFO))); 1507 cnri.pszCnrTitle = dcd->directory; 1508 WinSendMsg(hwnd, 1509 CM_SETCNRINFO, 1510 MPFROMP(&cnri), 1511 MPFROMLONG(CMA_CNRTITLE)); 1512 dcd->totalfiles = cnri.cRecords; 1513 commafmt(tb,sizeof(tb),dcd->totalfiles); 1514 CommaFmtULL(tf,sizeof(tf),dcd->ullTotalBytes,'K'); 1515 sprintf(s,"%s / %s",tb,tf); 1516 WinSetDlgItemText(dcd->hwndClient,DIR_TOTALS,s); 1517 commafmt(tb,sizeof(tb),dcd->selectedfiles); 1518 CommaFmtULL(tf,sizeof(tf),dcd->selectedbytes,'K'); 1519 sprintf(s,"%s / %s",tb,tf); 1520 WinSetDlgItemText(dcd->hwndClient,DIR_SELECTED,s); 1521 if (hwndStatus && 1522 dcd->hwndFrame == WinQueryActiveWindow(dcd->hwndParent)) { 1523 PostMsg(dcd->hwndObject, 1524 UM_RESCAN2, 1525 MPVOID, 1526 MPVOID); 1527 if ((fSplitStatus && hwndStatus2) || 1528 fMoreButtons) { 1529 pci = WinSendMsg(hwnd, 1530 CM_QUERYRECORDEMPHASIS, 1531 MPFROMLONG(CMA_FIRST), 1532 MPFROMSHORT(CRA_CURSORED)); 1533 if (pci && (INT)pci != -1) 1534 { 1535 if (fSplitStatus && hwndStatus2) 1536 { 1537 CommaFmtULL(tb,sizeof(tb),pci->cbFile + pci->easize,' '); 1538 if (!fMoreButtons) 1539 sprintf(s, 1540 " %s %04u/%02u/%02u %02u:%02u:%02u [%s] %s", 1541 tb, 1542 pci->date.year, 1543 pci->date.month, 1544 pci->date.day, 1545 pci->time.hours, 1546 pci->time.minutes, 1547 pci->time.seconds, 1548 pci->pszDispAttr, 1549 pci->pszFileName); 1550 else { 1551 *tf = 0; 1552 if (pci->cbFile + pci->easize > 1024) 1553 { 1554 CommaFmtULL(tf,sizeof(tf), 1555 pci->cbFile + pci->easize,'K'); 1556 } 1557 sprintf(s, 1558 GetPString(IDS_STATUSSIZETEXT), 1559 tb, 1560 *tf ? " (" : NullStr, 1561 tf, 1562 *tf ? ")" : NullStr); 1563 } 1564 WinSetWindowText(hwndStatus2,s); 1565 } 1566 else 1567 WinSetWindowText(hwndStatus2,NullStr); 1568 if (fMoreButtons) { 1569 WinSetWindowText(hwndName,pci->pszFileName); 1570 sprintf(s, 1571 "%04u/%02u/%02u %02u:%02u:%02u", 1572 pci->date.year, 1573 pci->date.month, 1574 pci->date.day, 1575 pci->time.hours, 1576 pci->time.minutes, 1577 pci->time.seconds); 1578 WinSetWindowText(hwndDate,s); 1579 WinSetWindowText(hwndAttr,pci->pszDispAttr); 1580 } 1581 } 1582 else { 1583 WinSetWindowText(hwndStatus2,NullStr); 1584 WinSetWindowText(hwndName,NullStr); 1585 WinSetWindowText(hwndDate,NullStr); 1586 WinSetWindowText(hwndAttr,NullStr); 1587 } 1588 } 1589 } 1590 } 1591 return 0; 1592 1593 case UM_SORTRECORD: 1594 if (dcd) { 1595 1596 CNRINFO cnri; 1597 1598 memset(&cnri,0,sizeof(CNRINFO)); 1599 cnri.cb = sizeof(CNRINFO); 1600 WinSendMsg(hwnd, 1601 CM_QUERYCNRINFO, 1602 MPFROMP(&cnri), 1603 MPFROMLONG(sizeof(CNRINFO))); 1604 cnri.pSortRecord = (PVOID)SortDirCnr; 1605 WinSendMsg(hwnd, 1606 CM_SETCNRINFO, 1607 MPFROMP(&cnri), 1608 MPFROMLONG(CMA_PSORTRECORD)); 1609 WinSendMsg(hwnd, 1610 CM_SORTRECORD, 1611 MPFROMP(SortDirCnr), 1612 MPFROMLONG(dcd->sortFlags)); 1613 } 1614 return 0; 1615 1616 case UM_SETUP: 1617 if (dcd) { 1618 if (!dcd->hwndObject) { 1619 /* 1620 * first time through -- set things up 1621 */ 1622 1623 CNRINFO cnri; 1624 1625 RestorePresParams(hwnd,"DirCnr"); 1626 LoadDetailsSwitches("DirCnr",dcd); 1627 memset(&cnri,0,sizeof(CNRINFO)); 1628 cnri.cb = sizeof(CNRINFO); 1629 WinSendMsg(hwnd, 1630 CM_QUERYCNRINFO, 1631 MPFROMP(&cnri), 1632 MPFROMLONG(sizeof(CNRINFO))); 1633 cnri.cyLineSpacing = 0; 1634 cnri.cxTreeIndent = 12L; 1635 1636 cnri.flWindowAttr &= (~(CV_TREE | CV_ICON | CV_DETAIL | CV_TEXT)); 1637 cnri.flWindowAttr |= (CV_NAME | CA_DETAILSVIEWTITLES | CV_MINI | 1638 CV_FLOW); 1639 cnri.pSortRecord = (PVOID)SortDirCnr; 1640 1641 { 1642 ULONG size = sizeof(ULONG); 1643 1644 PrfQueryProfileData(fmprof, 1645 appname, 1646 "DirflWindowAttr", 1647 (PVOID)&cnri.flWindowAttr, 1648 &size); 1649 size = sizeof(MASK); 1650 if (!*dcd->mask.szMask && 1651 !dcd->mask.attrFile && 1652 !dcd->mask.antiattr) 1653 { 1654 if (PrfQueryProfileSize(fmprof, 1655 appname, 1656 "DirFilter", 1657 &size) && 1658 size) 1659 { 1660 PrfQueryProfileData(fmprof, 1661 appname, 1662 "DirFilter", 1663 &dcd->mask, 1664 &size); 1665 SetMask(dcd->mask.szMask,&dcd->mask); 1666 } 1667 else 1668 dcd->mask.attrFile = (FILE_READONLY | FILE_NORMAL | 1669 FILE_ARCHIVED | FILE_DIRECTORY | 1670 FILE_HIDDEN | FILE_SYSTEM); 1671 } 1672 *(dcd->mask.prompt) = 0; 1673 } 1674 if (dcd->flWindowAttr) 1675 cnri.flWindowAttr = dcd->flWindowAttr; 1676 else 1677 dcd->flWindowAttr = cnri.flWindowAttr; 1678 cnri.flWindowAttr &= (~(CA_MIXEDTARGETEMPH | CA_ORDEREDTARGETEMPH | 1679 CA_TITLEREADONLY | CA_TITLESEPARATOR)); 1680 cnri.flWindowAttr |= CV_FLOW; 1681 dcd->flWindowAttr |= CV_FLOW; 1682 if (WinWindowFromID(dcd->hwndFrame,FID_TITLEBAR)) 1683 cnri.flWindowAttr &= (~CA_CONTAINERTITLE); 1684 else 1685 cnri.flWindowAttr |= CA_CONTAINERTITLE; 1686 if (!dcd->sortFlags) 1687 dcd->sortFlags = sortFlags; 1688 WinSendMsg(hwnd, 1689 CM_SETCNRINFO, 1690 MPFROMP(&cnri), 1691 MPFROMLONG(CMA_FLWINDOWATTR | CMA_LINESPACING | 1692 CMA_CXTREEINDENT | CMA_PSORTRECORD)); 1693 SetCnrCols(hwnd,FALSE); 1694 AdjustCnrColsForPref(hwnd, 1695 NULL, 1696 dcd, 1697 FALSE); 1698 if (_beginthread(MakeObjWin,NULL,245760,(PVOID)dcd) == -1) { 1699 Runtime_Error(pszSrcFile, __LINE__, GetPString(IDS_COULDNTSTARTTHREADTEXT)); 1700 PostMsg(hwnd,WM_CLOSE,MPVOID,MPVOID); 1701 return 0; 1702 } 1703 else 1704 DosSleep(64L); 1705 WinEnableMenuItem(DirCnrMenu,IDM_FINDINTREE, 1706 (hwndTree != (HWND)0)); 1707 } 1708 SayFilter(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT), 1709 DIR_FILTER),&dcd->mask,FALSE); 1710 SaySort(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT), 1711 DIR_SORT),dcd->sortFlags,FALSE); 1712 SayView(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT), 1713 DIR_VIEW),dcd->flWindowAttr); 1714 } 1715 else { 1716 PostMsg(hwnd, 1717 WM_CLOSE, 1718 MPVOID, 1719 MPVOID); 1720 return 0; 1721 } 1722 return 0; 1723 1724 case WM_MENUEND: 1725 if (dcd) { 1726 1727 HWND hwndMenu = (HWND)mp2; 1728 1729 if (hwndMenu == DirCnrMenu || 1730 hwndMenu == FileMenu || 1731 hwndMenu == DirMenu) 1916 dcd->sortFlags |= SORT_DIRSLAST; 1917 dcd->sortFlags &= (~SORT_DIRSFIRST); 1918 } 1919 break; 1920 case IDM_SORTREVERSE: 1921 if (dcd->sortFlags & SORT_REVERSE) 1922 dcd->sortFlags &= (~SORT_REVERSE); 1923 else 1924 dcd->sortFlags |= SORT_REVERSE; 1925 break; 1926 } 1927 WinSendMsg(hwnd, CM_SORTRECORD, MPFROMP(SortDirCnr), 1928 MPFROMLONG(dcd->sortFlags)); 1929 SaySort(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT), 1930 DIR_SORT), dcd->sortFlags, FALSE); 1931 break; 1932 1933 case IDM_COLLECT: 1934 if (!Collector) { 1935 1936 HWND hwndC; 1937 SWP swp; 1938 1939 if (!ParentIsDesktop(hwnd, dcd->hwndParent) && !fAutoTile && 1940 (!fExternalCollector && !strcmp(realappname, FM3Str))) 1941 GetNextWindowPos(dcd->hwndParent, &swp, NULL, NULL); 1942 hwndC = StartCollector((fExternalCollector || 1943 strcmp(realappname, FM3Str)) ? 1944 HWND_DESKTOP : dcd->hwndParent, 4); 1945 if (hwndC) { 1946 if (!ParentIsDesktop(hwnd, dcd->hwndParent) && !fAutoTile && 1947 (!fExternalCollector && !strcmp(realappname, FM3Str))) 1948 WinSetWindowPos(hwndC, HWND_TOP, swp.x, swp.y, 1949 swp.cx, swp.cy, SWP_MOVE | SWP_SIZE | 1950 SWP_SHOW | SWP_ZORDER); 1951 else if (!ParentIsDesktop(hwnd, dcd->hwndParent) && fAutoTile && 1952 !strcmp(realappname, FM3Str)) 1953 TileChildren(dcd->hwndParent, TRUE); 1954 WinSetWindowPos(hwndC, HWND_TOP, 0, 0, 0, 0, SWP_ACTIVATE); 1955 DosSleep(250L); 1956 } 1957 } 1958 else 1959 StartCollector(dcd->hwndParent, 4); 1960 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_COLLECTOR, 0), MPVOID); 1961 break; 1962 1963 case IDM_COLLECTOR: 1964 DosSleep(64L); 1732 1965 { 1733 MarkAll(hwnd,TRUE,FALSE,TRUE); 1734 if (dcd->cnremphasized) { 1735 WinSendMsg(hwnd,CM_SETRECORDEMPHASIS,MPVOID, 1736 MPFROM2SHORT(FALSE,CRA_SOURCE)); 1737 dcd->cnremphasized = FALSE; 1738 } 1739 } 1740 } 1741 break; 1742 1743 case UM_OPENWINDOWFORME: 1744 if (dcd) { 1745 if (mp1 && !IsFile((CHAR *)mp1)) { 1746 OpenDirCnr(hwnd, 1747 dcd->hwndParent, 1748 dcd->hwndFrame, 1749 FALSE, 1750 (char *)mp1); 1751 } 1752 else if (mp1 && IsFile(mp1) == 1) { 1753 StartArcCnr(HWND_DESKTOP, 1754 dcd->hwndFrame, 1755 (CHAR *)mp1, 1756 4, 1757 (ARC_TYPE *)mp2); 1758 } 1759 } 1760 return 0; 1761 1762 case MM_PORTHOLEINIT: 1763 if (dcd) { 1764 switch(SHORT1FROMMP(mp1)) { 1765 case 0: 1766 case 1: 1767 { 1768 ULONG wmsg; 1769 1770 wmsg = (SHORT1FROMMP(mp1) == 0) ? UM_FILESMENU : UM_VIEWSMENU; 1771 PortholeInit((HWND)WinSendMsg(dcd->hwndClient, 1772 wmsg, 1773 MPVOID, 1774 MPVOID), 1775 mp1, 1776 mp2); 1777 } 1778 break; 1779 } 1780 } 1781 break; 1782 1783 case UM_INITMENU: 1784 case WM_INITMENU: 1785 if (dcd) { 1786 switch(SHORT1FROMMP(mp1)) { 1787 case IDM_FILESMENU: 1788 if (isalpha(*dcd->directory)) { 1789 if (driveflags[toupper(*dcd->directory) - 'A'] & DRIVE_NOTWRITEABLE) { 1790 WinEnableMenuItem((HWND)mp2,IDM_MOVEMENU,FALSE); 1791 WinEnableMenuItem((HWND)mp2,IDM_RENAME,FALSE); 1792 WinEnableMenuItem((HWND)mp2,IDM_MKDIR,FALSE); 1793 WinEnableMenuItem((HWND)mp2,IDM_UNDELETE,FALSE); 1794 WinEnableMenuItem((HWND)mp2,IDM_DELETESUBMENU,FALSE); 1795 WinEnableMenuItem((HWND)mp2,IDM_DELETE,FALSE); 1796 WinEnableMenuItem((HWND)mp2,IDM_EDIT,FALSE); 1797 WinEnableMenuItem((HWND)mp2,IDM_EDITTEXT,FALSE); 1798 WinEnableMenuItem((HWND)mp2,IDM_EDITBINARY,FALSE); 1799 WinEnableMenuItem((HWND)mp2,IDM_ATTRS,FALSE); 1800 } 1801 else { 1802 WinEnableMenuItem((HWND)mp2,IDM_MOVEMENU,TRUE); 1803 WinEnableMenuItem((HWND)mp2,IDM_RENAME,TRUE); 1804 WinEnableMenuItem((HWND)mp2,IDM_MKDIR,TRUE); 1805 WinEnableMenuItem((HWND)mp2,IDM_UNDELETE,TRUE); 1806 WinEnableMenuItem((HWND)mp2,IDM_DELETESUBMENU,TRUE); 1807 WinEnableMenuItem((HWND)mp2,IDM_DELETE,TRUE); 1808 WinEnableMenuItem((HWND)mp2,IDM_EDIT,TRUE); 1809 WinEnableMenuItem((HWND)mp2,IDM_EDITTEXT,TRUE); 1810 WinEnableMenuItem((HWND)mp2,IDM_EDITBINARY,TRUE); 1811 WinEnableMenuItem((HWND)mp2,IDM_ATTRS,TRUE); 1812 } 1813 } 1814 break; 1815 1816 case IDM_VIEWSMENU: 1817 SetViewMenu((HWND)mp2,dcd->flWindowAttr); 1818 WinEnableMenuItem((HWND)mp2,IDM_RESELECT, 1819 (dcd->lastselection != NULL)); 1820 if (isalpha(*dcd->directory)) { 1821 if (driveflags[toupper(*dcd->directory) - 'A'] & 1822 DRIVE_NOTWRITEABLE) 1823 WinEnableMenuItem((HWND)mp2, 1824 IDM_MKDIR, 1825 FALSE); 1826 else 1827 WinEnableMenuItem((HWND)mp2, 1828 IDM_MKDIR, 1829 TRUE); 1830 } 1831 WinEnableMenuItem((HWND)mp2, 1832 IDM_SELECTCOMPAREMENU, 1833 (CountDirCnrs(dcd->hwndParent) > 1)); 1834 break; 1835 1836 case IDM_DETAILSSETUP: 1837 SetDetailsSwitches((HWND)mp2,dcd); 1838 break; 1839 1840 case IDM_COMMANDSMENU: 1841 SetupCommandMenu((HWND)mp2,hwnd); 1842 break; 1843 1844 case IDM_SORTSUBMENU: 1845 SetSortChecks((HWND)mp2,dcd->sortFlags); 1846 break; 1847 1848 case IDM_WINDOWSMENU: 1849 SetupWinList((HWND)mp2, 1850 (hwndMain) ? hwndMain : (HWND)0, 1851 dcd->hwndFrame); 1852 break; 1853 } 1854 dcd->hwndLastMenu = (HWND)mp2; 1855 } 1856 if (msg == WM_INITMENU) 1857 break; 1858 return 0; 1859 1860 case UM_FILTER: 1861 if (dcd) { 1862 1863 PCNRITEM pci; 1864 1865 if (mp1) { 1866 DosEnterCritSec(); 1867 SetMask((CHAR *)mp1,&dcd->mask); 1868 DosExitCritSec(); 1869 } 1870 dcd->suspendview = 1; 1871 WinSendMsg(hwnd,CM_FILTER,MPFROMP(Filter),MPFROMP(&dcd->mask)); 1872 dcd->suspendview = 0; 1873 if (fAutoView && hwndMain) { 1874 pci = WinSendMsg(hwnd,CM_QUERYRECORDEMPHASIS, 1875 MPFROMLONG(CMA_FIRST), 1876 MPFROMSHORT(CRA_CURSORED)); 1877 if (pci && (INT)pci != -1 && 1878 (!(driveflags[toupper(*pci->szFileName) - 'A'] & DRIVE_SLOW))) 1879 WinSendMsg(hwndMain, 1880 UM_LOADFILE, 1881 MPFROMP(pci->szFileName), 1882 MPVOID); 1883 else 1884 WinSendMsg(hwndMain, 1885 UM_LOADFILE, 1886 MPVOID, 1887 MPVOID); 1888 } 1889 PostMsg(hwnd, 1890 UM_RESCAN, 1891 MPVOID, 1892 MPVOID); 1893 } 1894 return 0; 1895 1896 case UM_COMMAND: 1897 if (mp1) { 1898 if (dcd) { 1899 if (!PostMsg(dcd->hwndObject, 1900 UM_COMMAND, 1901 mp1, 1902 mp2)) 1903 { 1904 Runtime_Error(pszSrcFile, __LINE__, "PostMsg"); 1905 FreeListInfo((LISTINFO *)mp1); 1906 } 1907 else 1908 return (MRESULT)TRUE; 1909 } 1910 else 1911 FreeListInfo((LISTINFO *)mp1); 1912 } 1913 return 0; 1914 1915 case UM_NOTIFY: 1916 if (mp2) 1917 Notify((CHAR *)mp2); 1918 return 0; 1919 1920 case UM_DRIVECMD: 1921 if (mp1) 1922 WinSendMsg(hwnd, 1923 WM_COMMAND, 1924 MPFROM2SHORT(IDM_SWITCH,0), 1925 mp1); 1926 return 0; 1927 1928 case WM_COMMAND: 1929 DosError(FERR_DISABLEHARDERR); 1930 if (dcd) { 1931 switch(SHORT1FROMMP(mp1)) { 1932 case IDM_SETTARGET: 1933 SetTargetDir(hwnd,FALSE); 1934 break; 1935 1936 case IDM_CREATE: 1937 { 1938 STRINGINPARMS sip; 1939 CHAR filename[CCHMAXPATHCOMP]; 1940 1941 memset(&sip,0,sizeof(sip)); 1942 sip.help = GetPString(IDS_CREATETEXT); 1943 sip.prompt = GetPString(IDS_CREATEPROMPTTEXT); 1944 sip.inputlen = CCHMAXPATHCOMP - (strlen(dcd->directory) - 1); 1945 strcpy(filename,"NEWFILE.TXT"); 1946 sip.ret = filename; 1947 sip.title = GetPString(IDS_CREATETITLETEXT); 1948 if (WinDlgBox(HWND_DESKTOP,hwnd,InputDlgProc,FM3ModHandle, 1949 STR_FRAME,&sip)) 1950 { 1951 bstrip(sip.ret); 1952 if (*sip.ret) 1953 { 1954 CHAR newfile[CCHMAXPATH]; 1955 FILE *fp; 1956 INT test; 1957 PCNRITEM pci; 1958 1959 strcpy(newfile,dcd->directory); 1960 if (newfile[strlen(newfile) - 1] != '\\') 1961 strcat(newfile,"\\"); 1962 strcat(newfile,sip.ret); 1963 test = IsFile(newfile); 1964 if (test != 1) 1965 fp = fopen(newfile,"w"); 1966 if (test != 1 && !fp) { 1967 saymsg(MB_ENTER, 1968 hwnd, 1969 GetPString(IDS_ERRORTEXT), 1970 GetPString(IDS_CREATEERRORTEXT), 1971 newfile); 1972 } 1973 else { 1974 if (fp) { 1975 WinSendMsg(hwnd, 1976 UM_UPDATERECORD, 1977 MPFROMP(newfile), 1978 MPVOID); 1979 fclose(fp); 1980 } 1981 if (*editor) { 1982 1983 CHAR *dummy[2]; 1984 1985 dummy[0] = newfile; 1986 dummy[1] = NULL; 1987 ExecOnList(hwnd, 1988 editor, 1989 WINDOWED | SEPARATE, 1990 NULL, 1991 dummy, 1992 NULL); 1993 } 1994 else 1995 StartMLEEditor(dcd->hwndParent, 1996 4, 1997 newfile, 1998 dcd->hwndFrame); 1999 pci = FindCnrRecord(hwnd, 2000 newfile, 2001 NULL, 2002 TRUE, 2003 FALSE, 2004 TRUE); 2005 if (pci && (INT)pci != -1) 2006 /* make sure that record shows in viewport */ 2007 ShowCnrRecord(hwnd,(PMINIRECORDCORE)pci); 2008 } 2009 } 2010 } 2011 } 2012 break; 2013 2014 case IDM_CONTEXTMENU: 2015 { 2016 PCNRITEM pci; 2017 2018 pci = (PCNRITEM)CurrentRecord(hwnd); 2019 PostMsg(hwnd,WM_CONTROL,MPFROM2SHORT(DIR_CNR,CN_CONTEXTMENU), 2020 MPFROMP(pci)); 2021 } 2022 break; 2023 2024 case IDM_MAXIMIZE: 2025 PostMsg(hwndMain, 2026 UM_MAXIMIZE, 2027 MPFROMLONG(dcd->hwndFrame), 2028 MPVOID); 2029 break; 2030 2031 case IDM_SHOWALLFILESCNR: 2032 StartSeeAll(HWND_DESKTOP,FALSE,dcd->directory); 2033 break; 2034 2035 case IDM_SHOWALLFILES: 2036 { 2037 PCNRITEM pci; 2038 2039 pci = WinSendMsg(hwnd,CM_QUERYRECORDEMPHASIS, 2040 MPFROMLONG(CMA_FIRST), 2041 MPFROMSHORT(CRA_CURSORED)); 2042 if (pci && (INT)pci != -1) { 2043 2044 static CHAR dirname[CCHMAXPATH]; 2045 2046 strcpy(dirname,pci->szFileName); 2047 MakeValidDir(dirname); 2048 StartSeeAll(HWND_DESKTOP,FALSE,dirname); 2049 } 2050 } 2051 break; 2052 2053 case IDM_FINDINTREE: 2054 if (hwndTree) 2055 WinSendMsg(hwndTree,UM_SHOWME,MPFROMP(dcd->directory), 2056 MPFROMLONG(1L)); 2057 break; 2058 2059 case IDM_BEGINEDIT: 2060 OpenEdit(hwnd); 2061 break; 2062 2063 case IDM_ENDEDIT: 2064 WinSendMsg(hwnd, 2065 CM_CLOSEEDIT, 2066 MPVOID, 2067 MPVOID); 2068 break; 2069 2070 case IDM_SHOWSELECT: 2071 QuickPopup(hwnd, 2072 dcd, 2073 CheckMenu(&DirCnrMenu,DIRCNR_POPUP), 2074 IDM_SELECTSUBMENU); 2075 break; 2076 2077 case IDM_SHOWSORT: 2078 QuickPopup(hwnd,dcd,CheckMenu(&DirCnrMenu,DIRCNR_POPUP), 2079 IDM_SORTSUBMENU); 2080 break; 2081 2082 case IDM_VIEWORARC: 2083 { 2084 SWP swp; 2085 PCNRITEM pci; 2086 2087 pci = (PCNRITEM)WinSendMsg(hwnd,CM_QUERYRECORDEMPHASIS, 2088 MPFROMLONG(CMA_FIRST), 2089 MPFROMSHORT(CRA_CURSORED)); 2090 if (pci && (INT)pci != -1) { 2091 WinQueryWindowPos(dcd->hwndFrame,&swp); 2092 DefaultViewKeys(hwnd, 2093 dcd->hwndFrame, 2094 dcd->hwndParent, 2095 &swp, 2096 pci->szFileName); 2097 } 2098 } 2099 break; 2100 2101 case IDM_NOTEBOOK: 2102 if (!ParentIsDesktop(dcd->hwndParent,dcd->hwndParent)) 2103 PostMsg(dcd->hwndParent,msg,mp1,mp2); 2104 else 2105 WinDlgBox(HWND_DESKTOP,hwnd,CfgDlgProc,FM3ModHandle, 2106 CFG_FRAME,(PVOID)"Directory"); 2107 break; 2108 2109 case IDM_QTREE: 2110 case IDM_TREE: 2111 { 2112 CHAR newpath[CCHMAXPATH]; 2113 APIRET rc; 2114 PCNRITEM pci; 2115 2116 if (SHORT1FROMMP(mp1) == IDM_TREE) { 2117 pci = (PCNRITEM)CurrentRecord(hwnd); 2118 if (pci && (INT)pci != -1) 2119 strcpy(newpath,pci->szFileName); 2120 else 2121 strcpy(newpath,dcd->directory); 2122 } 2123 else 2124 strcpy(newpath,dcd->directory); 2125 MakeValidDir(newpath); 2126 rc = WinDlgBox(HWND_DESKTOP,dcd->hwndClient,ObjCnrDlgProc, 2127 FM3ModHandle,QTREE_FRAME,MPFROMP(newpath)); 2128 if (rc) 2129 WinSendMsg(hwnd,UM_SETDIR,MPFROMP(newpath),MPVOID); 2130 } 2131 break; 2132 2133 case IDM_RESELECT: 2134 SelectList(hwnd,TRUE,FALSE,FALSE,NULL,NULL, 2135 dcd->lastselection); 2136 break; 2137 2138 case IDM_HELP: 2139 if (hwndHelp) { 2140 if (!ParentIsDesktop(dcd->hwndFrame,dcd->hwndParent)) 2141 PostMsg(dcd->hwndParent,UM_COMMAND,mp1,mp2); 2142 else 2143 WinSendMsg(hwndHelp,HM_HELP_CONTENTS,MPVOID,MPVOID); 2144 } 2145 break; 2146 2147 case IDM_WINDOWDLG: 2148 if (!ParentIsDesktop(dcd->hwndFrame,dcd->hwndParent)) 2149 PostMsg(dcd->hwndParent,UM_COMMAND, 2150 MPFROM2SHORT(IDM_WINDOWDLG,0),MPVOID); 2151 break; 2152 2153 case IDM_SORTSMARTNAME: 2154 case IDM_SORTNAME: 2155 case IDM_SORTFILENAME: 2156 case IDM_SORTSIZE: 2157 case IDM_SORTEASIZE: 2158 case IDM_SORTFIRST: 2159 case IDM_SORTLAST: 2160 case IDM_SORTLWDATE: 2161 case IDM_SORTLADATE: 2162 case IDM_SORTCRDATE: 2163 case IDM_SORTSUBJECT: 2164 dcd->sortFlags &= (SORT_REVERSE | SORT_DIRSFIRST | SORT_DIRSLAST); 2165 case IDM_SORTDIRSFIRST: 2166 case IDM_SORTDIRSLAST: 2167 case IDM_SORTREVERSE: 2168 switch(SHORT1FROMMP(mp1)) { 2169 case IDM_SORTSUBJECT: 2170 dcd->sortFlags |= SORT_SUBJECT; 2171 break; 2172 case IDM_SORTSMARTNAME: 2173 case IDM_SORTFILENAME: 2174 dcd->sortFlags |= SORT_FILENAME; 2175 break; 2176 case IDM_SORTSIZE: 2177 dcd->sortFlags |= SORT_SIZE; 2178 break; 2179 case IDM_SORTEASIZE: 2180 dcd->sortFlags |= SORT_EASIZE; 2181 break; 2182 case IDM_SORTFIRST: 2183 dcd->sortFlags |= SORT_FIRSTEXTENSION; 2184 break; 2185 case IDM_SORTLAST: 2186 dcd->sortFlags |= SORT_LASTEXTENSION; 2187 break; 2188 case IDM_SORTLWDATE: 2189 dcd->sortFlags |= SORT_LWDATE; 2190 break; 2191 case IDM_SORTLADATE: 2192 dcd->sortFlags |= SORT_LADATE; 2193 break; 2194 case IDM_SORTCRDATE: 2195 dcd->sortFlags |= SORT_CRDATE; 2196 break; 2197 case IDM_SORTDIRSFIRST: 2198 if (dcd->sortFlags & SORT_DIRSFIRST) 2199 dcd->sortFlags &= (~SORT_DIRSFIRST); 2200 else { 2201 dcd->sortFlags |= SORT_DIRSFIRST; 2202 dcd->sortFlags &= (~SORT_DIRSLAST); 2203 } 2204 break; 2205 case IDM_SORTDIRSLAST: 2206 if (dcd->sortFlags & SORT_DIRSLAST) 2207 dcd->sortFlags &= (~SORT_DIRSLAST); 2208 else { 2209 dcd->sortFlags |= SORT_DIRSLAST; 2210 dcd->sortFlags &= (~SORT_DIRSFIRST); 2211 } 2212 break; 2213 case IDM_SORTREVERSE: 2214 if (dcd->sortFlags & SORT_REVERSE) 2215 dcd->sortFlags &= (~SORT_REVERSE); 2216 else 2217 dcd->sortFlags |= SORT_REVERSE; 2218 break; 2219 } 2220 WinSendMsg(hwnd,CM_SORTRECORD,MPFROMP(SortDirCnr), 2221 MPFROMLONG(dcd->sortFlags)); 2222 SaySort(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT), 2223 DIR_SORT),dcd->sortFlags,FALSE); 2224 break; 2225 2226 case IDM_COLLECT: 2227 if (!Collector) { 2228 2229 HWND hwndC; 2230 SWP swp; 2231 2232 if (!ParentIsDesktop(hwnd,dcd->hwndParent) && !fAutoTile && 2233 (!fExternalCollector && !strcmp(realappname,FM3Str))) 2234 GetNextWindowPos(dcd->hwndParent,&swp,NULL,NULL); 2235 hwndC = StartCollector((fExternalCollector || 2236 strcmp(realappname,FM3Str)) ? 2237 HWND_DESKTOP : 2238 dcd->hwndParent,4); 2239 if (hwndC) { 2240 if (!ParentIsDesktop(hwnd,dcd->hwndParent) && !fAutoTile && 2241 (!fExternalCollector && !strcmp(realappname,FM3Str))) 2242 WinSetWindowPos(hwndC,HWND_TOP,swp.x,swp.y, 2243 swp.cx,swp.cy,SWP_MOVE | SWP_SIZE | 2244 SWP_SHOW | SWP_ZORDER); 2245 else if (!ParentIsDesktop(hwnd,dcd->hwndParent) && fAutoTile && 2246 !strcmp(realappname,FM3Str)) 2247 TileChildren(dcd->hwndParent,TRUE); 2248 WinSetWindowPos(hwndC,HWND_TOP,0,0,0,0,SWP_ACTIVATE); 2249 DosSleep(250L); 2250 } 2251 } 2252 else 2253 StartCollector(dcd->hwndParent,4); 2254 PostMsg(hwnd,WM_COMMAND,MPFROM2SHORT(IDM_COLLECTOR,0),MPVOID); 2255 break; 2256 2257 case IDM_COLLECTOR: 2258 DosSleep(64L); 2259 { 2260 CHAR **list; 2261 2262 list = BuildList(hwnd); 2263 if (list) { 2264 if (Collector) { 2265 if (!PostMsg(Collector, 2266 WM_COMMAND, 2267 MPFROM2SHORT(IDM_COLLECTOR,0), 2268 MPFROMP(list))) 2269 FreeList(list); 2270 else if (fUnHilite) 2271 UnHilite(hwnd,TRUE,&dcd->lastselection); 2272 } 2273 else 2274 FreeList(list); 2275 } 2276 } 2277 break; 2278 2279 case IDM_UNDELETE: 2280 { 2281 PCNRITEM pci; 2282 CHAR path[CCHMAXPATH]; 2283 2284 pci = (PCNRITEM)CurrentRecord(hwnd); 2285 if (pci && (INT)pci != -1) { 2286 strcpy(path,pci->szFileName); 2287 MakeValidDir(path); 2288 WinDlgBox(HWND_DESKTOP,hwnd,UndeleteDlgProc,FM3ModHandle, 2289 UNDEL_FRAME,MPFROMP(path)); 2290 } 2291 } 2292 break; 2293 2294 case IDM_UNDELETESPEC: 2295 WinDlgBox(HWND_DESKTOP, 2296 hwnd, 2297 UndeleteDlgProc, 2298 FM3ModHandle, 2299 UNDEL_FRAME, 2300 MPFROMP(dcd->directory)); 2301 break; 2302 2303 case IDM_RESORT: 1966 CHAR **list; 1967 1968 list = BuildList(hwnd); 1969 if (list) { 1970 if (Collector) { 1971 if (!PostMsg(Collector, 1972 WM_COMMAND, 1973 MPFROM2SHORT(IDM_COLLECTOR, 0), MPFROMP(list))) 1974 FreeList(list); 1975 else if (fUnHilite) 1976 UnHilite(hwnd, TRUE, &dcd->lastselection); 1977 } 1978 else 1979 FreeList(list); 1980 } 1981 } 1982 break; 1983 1984 case IDM_UNDELETE: 1985 { 1986 PCNRITEM pci; 1987 CHAR path[CCHMAXPATH]; 1988 1989 pci = (PCNRITEM) CurrentRecord(hwnd); 1990 if (pci && (INT) pci != -1) { 1991 strcpy(path, pci->szFileName); 1992 MakeValidDir(path); 1993 WinDlgBox(HWND_DESKTOP, hwnd, UndeleteDlgProc, FM3ModHandle, 1994 UNDEL_FRAME, MPFROMP(path)); 1995 } 1996 } 1997 break; 1998 1999 case IDM_UNDELETESPEC: 2000 WinDlgBox(HWND_DESKTOP, 2001 hwnd, 2002 UndeleteDlgProc, 2003 FM3ModHandle, UNDEL_FRAME, MPFROMP(dcd->directory)); 2004 break; 2005 2006 case IDM_RESORT: 2304 2007 // WinSendMsg(hwnd, 2305 2008 // CM_SORTRECORD, 2306 2009 // MPFROMP(SortDirCnr), 2307 2010 // MPFROMLONG((fSyncUpdates) ? sortFlags : dcd->sortFlags)); 2308 WinSendMsg(hwnd, 2309 CM_SORTRECORD, 2310 MPFROMP(SortDirCnr), 2311 MPFROMLONG(dcd->sortFlags)); 2312 break; 2313 2314 case IDM_FILTER: 2315 { 2316 BOOL empty = FALSE; 2317 PCNRITEM pci; 2318 CHAR *p; 2319 2320 if (!*dcd->mask.szMask) { 2321 empty = TRUE; 2322 pci = (PCNRITEM)CurrentRecord(hwnd); 2323 if (pci && !(pci->attrFile & FILE_DIRECTORY)) { 2324 p = strrchr(pci->szFileName,'\\'); 2325 if (p) { 2326 p++; 2327 strcpy(dcd->mask.szMask,p); 2328 } 2329 } 2330 } 2331 *(dcd->mask.prompt) = 0; 2332 2333 if (WinDlgBox(HWND_DESKTOP,hwnd,PickMaskDlgProc, 2334 FM3ModHandle,MSK_FRAME,MPFROMP(&dcd->mask))) 2335 WinSendMsg(hwnd,UM_FILTER,MPVOID,MPVOID); 2336 else if (empty) 2337 *dcd->mask.szMask = 0; 2338 SayFilter(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT), 2339 DIR_FILTER),&dcd->mask,FALSE); 2340 } 2341 break; 2342 2343 case IDM_HIDEALL: 2344 if (fAutoView && hwndMain) 2345 PostMsg(hwndMain, 2346 UM_LOADFILE, 2347 MPVOID, 2348 MPVOID); 2349 dcd->suspendview = 1; 2350 HideAll(hwnd); 2351 dcd->suspendview = 0; 2352 PostMsg(hwnd, 2353 UM_RESCAN, 2354 MPVOID, 2355 MPVOID); 2356 break; 2357 2358 case IDM_SELECTBOTH: 2359 case IDM_SELECTONE: 2360 case IDM_SELECTMORE: 2361 case IDM_SELECTNEWER: 2362 case IDM_SELECTOLDER: 2363 case IDM_SELECTBIGGER: 2364 case IDM_SELECTSMALLER: 2365 case IDM_DESELECTBOTH: 2366 case IDM_DESELECTONE: 2367 case IDM_DESELECTMORE: 2368 case IDM_DESELECTNEWER: 2369 case IDM_DESELECTOLDER: 2370 case IDM_DESELECTBIGGER: 2371 case IDM_DESELECTSMALLER: 2372 if (ParentIsDesktop(hwnd,dcd->hwndParent)) { 2373 Runtime_Error(pszSrcFile, __LINE__, "ParentIsDesktop unexpected"); 2374 break; 2375 } 2376 case IDM_SELECTLIST: 2377 case IDM_SELECTALL: 2378 case IDM_DESELECTALL: 2379 case IDM_SELECTALLFILES: 2380 case IDM_DESELECTALLFILES: 2381 case IDM_SELECTALLDIRS: 2382 case IDM_DESELECTALLDIRS: 2383 case IDM_SELECTMASK: 2384 case IDM_DESELECTMASK: 2385 case IDM_INVERT: 2386 case IDM_SELECTCLIP: 2387 case IDM_DESELECTCLIP: 2388 { 2389 PCNRITEM pci; 2390 2391 pci = (PCNRITEM)CurrentRecord(hwnd); 2392 if ((INT)pci == -1) 2393 pci = NULL; 2394 if (SHORT1FROMMP(mp1) == IDM_HIDEALL) { 2395 if (pci) { 2396 if (!(pci->rc.flRecordAttr & CRA_SELECTED)) 2397 pci->rc.flRecordAttr |= CRA_FILTERED; 2398 WinSendMsg(hwnd,CM_INVALIDATERECORD,MPFROMP(&pci), 2399 MPFROM2SHORT(1,CMA_ERASE | CMA_REPOSITION)); 2400 break; 2401 } 2402 } 2403 PostMsg(dcd->hwndObject, 2404 UM_SELECT, 2405 mp1, 2406 MPFROMP(pci)); 2407 } 2408 break; 2409 2410 case IDM_RESCAN: 2411 DosEnterCritSec(); 2412 dcd->stopflag++; 2413 DosExitCritSec(); 2414 if (!PostMsg(dcd->hwndObject, 2415 UM_RESCAN, 2416 MPVOID, 2417 MPVOID)) 2418 { 2419 DosEnterCritSec(); 2420 dcd->stopflag--; 2421 DosExitCritSec(); 2422 } 2423 break; 2424 2425 case IDM_SHOWLNAMES: 2426 case IDM_SHOWSUBJECT: 2427 case IDM_SHOWEAS: 2428 case IDM_SHOWSIZE: 2429 case IDM_SHOWICON: 2430 case IDM_SHOWLWDATE: 2431 case IDM_SHOWLWTIME: 2432 case IDM_SHOWLADATE: 2433 case IDM_SHOWLATIME: 2434 case IDM_SHOWCRDATE: 2435 case IDM_SHOWCRTIME: 2436 case IDM_SHOWATTR: 2437 AdjustDetailsSwitches(hwnd, 2438 dcd->hwndLastMenu, 2439 SHORT1FROMMP(mp1), 2440 dcd->directory, 2441 "DirCnr", 2442 dcd, 2443 FALSE); 2444 break; 2445 2446 case IDM_TREEVIEW: 2447 case IDM_ICON: 2448 case IDM_TEXT: 2449 case IDM_DETAILS: 2450 case IDM_NAME: 2451 case IDM_MINIICONS: 2452 case IDM_DETAILSTITLES: 2453 { 2454 CNRINFO cnri; 2455 2456 memset(&cnri,0,sizeof(CNRINFO)); 2457 cnri.cb = sizeof(CNRINFO); 2458 WinSendMsg(hwnd,CM_QUERYCNRINFO,MPFROMP(&cnri), 2459 MPFROMLONG(sizeof(CNRINFO))); 2460 switch(SHORT1FROMMP(mp1)) { 2461 case IDM_TREEVIEW: 2462 if (!(cnri.flWindowAttr & CV_TREE)) 2463 dcd->lastattr = cnri.flWindowAttr; 2464 cnri.flWindowAttr &= (~(CV_ICON | CV_TREE | CV_TEXT | 2465 CV_DETAIL | CV_NAME | CA_TREELINE)); 2466 cnri.flWindowAttr |= CA_TREELINE | CV_TREE | CV_ICON; 2467 if (!dcd->firsttree) 2468 PostMsg(dcd->hwndObject,UM_FLESH,MPVOID,MPVOID); 2469 break; 2470 case IDM_ICON: 2471 cnri.flWindowAttr &= (~(CV_ICON | CV_TREE | CV_TEXT | 2472 CV_DETAIL | CV_NAME | CA_TREELINE)); 2473 cnri.flWindowAttr |= CV_ICON; 2474 break; 2475 case IDM_NAME: 2476 cnri.flWindowAttr &= (~(CV_ICON | CV_TREE | CV_TEXT | 2477 CV_DETAIL | CV_NAME | CA_TREELINE)); 2478 cnri.flWindowAttr |= CV_NAME; 2479 break; 2480 case IDM_TEXT: 2481 cnri.flWindowAttr &= (~(CV_ICON | CV_TREE | CV_TEXT | 2482 CV_DETAIL | CV_NAME | CA_TREELINE)); 2483 cnri.flWindowAttr |= CV_TEXT; 2484 break; 2485 case IDM_DETAILS: 2486 cnri.flWindowAttr &= (~(CV_ICON | CV_TREE | CV_TEXT | 2487 CV_DETAIL | CV_NAME | CA_TREELINE)); 2488 cnri.flWindowAttr |= CV_DETAIL; 2489 break; 2490 case IDM_MINIICONS: 2491 if (cnri.flWindowAttr & CV_MINI) 2492 cnri.flWindowAttr &= (~CV_MINI); 2493 else 2494 cnri.flWindowAttr |= CV_MINI; 2495 break; 2496 case IDM_DETAILSTITLES: 2497 if (cnri.flWindowAttr & CA_DETAILSVIEWTITLES) 2498 cnri.flWindowAttr &= (~CA_DETAILSVIEWTITLES); 2499 else 2500 cnri.flWindowAttr |= CA_DETAILSVIEWTITLES; 2501 break; 2502 } 2503 cnri.flWindowAttr &= (~(CA_ORDEREDTARGETEMPH | 2504 CA_MIXEDTARGETEMPH)); 2505 cnri.flWindowAttr |= CV_FLOW; 2506 dcd->flWindowAttr = cnri.flWindowAttr; 2507 WinSendMsg(hwnd,CM_SETCNRINFO,MPFROMP(&cnri), 2508 MPFROMLONG(CMA_FLWINDOWATTR)); 2509 WinSendMsg(hwnd,CM_INVALIDATERECORD,MPVOID, 2510 MPFROM2SHORT(0,CMA_ERASE | CMA_REPOSITION)); 2511 SayView(WinWindowFromID(WinQueryWindow(hwnd,QW_PARENT), 2512 DIR_VIEW),dcd->flWindowAttr); 2513 } 2514 break; 2515 2516 case IDM_SAVETOLIST: 2517 WinDlgBox(HWND_DESKTOP,hwnd,SaveListDlgProc,FM3ModHandle, 2518 SAV_FRAME,MPFROMP(&hwnd)); 2519 break; 2520 2521 case IDM_SIZES: 2522 { 2523 PCNRITEM pci; 2524 CHAR path[CCHMAXPATH]; 2525 2526 pci = (PCNRITEM)CurrentRecord(hwnd); 2527 if (pci && (INT)pci != -1) 2528 strcpy(path,pci->szFileName); 2529 else 2530 strcpy(path,dcd->directory); 2531 MakeValidDir(path); 2532 WinDlgBox(HWND_DESKTOP, 2533 HWND_DESKTOP, 2534 DirSizeProc, 2535 FM3ModHandle, 2536 DSZ_FRAME, 2537 path); 2538 } 2539 break; 2540 2541 case IDM_MKDIR: 2542 { 2543 PCNRITEM pci; 2544 2545 pci = (PCNRITEM)CurrentRecord(hwnd); 2546 PMMkDir(dcd->hwndParent, 2547 ((pci && (INT)pci != -1) ? 2548 pci->szFileName : 2549 dcd->directory), 2550 FALSE); 2551 } 2552 break; 2553 2554 case IDM_SWITCH: 2555 if (mp2) { 2556 strcpy(dcd->previous,dcd->directory); 2557 strcpy(dcd->directory,(CHAR *)mp2); 2558 DosEnterCritSec(); 2559 dcd->stopflag++; 2560 DosExitCritSec(); 2561 if (!PostMsg(dcd->hwndObject, 2562 UM_RESCAN, 2563 MPVOID, 2564 MPFROMLONG(1L))) 2011 WinSendMsg(hwnd, 2012 CM_SORTRECORD, 2013 MPFROMP(SortDirCnr), MPFROMLONG(dcd->sortFlags)); 2014 break; 2015 2016 case IDM_FILTER: 2017 { 2018 BOOL empty = FALSE; 2019 PCNRITEM pci; 2020 CHAR *p; 2021 2022 if (!*dcd->mask.szMask) { 2023 empty = TRUE; 2024 pci = (PCNRITEM) CurrentRecord(hwnd); 2025 if (pci && !(pci->attrFile & FILE_DIRECTORY)) { 2026 p = strrchr(pci->szFileName, '\\'); 2027 if (p) { 2028 p++; 2029 strcpy(dcd->mask.szMask, p); 2030 } 2031 } 2032 } 2033 *(dcd->mask.prompt) = 0; 2034 2035 if (WinDlgBox(HWND_DESKTOP, hwnd, PickMaskDlgProc, 2036 FM3ModHandle, MSK_FRAME, MPFROMP(&dcd->mask))) 2037 WinSendMsg(hwnd, UM_FILTER, MPVOID, MPVOID); 2038 else if (empty) 2039 *dcd->mask.szMask = 0; 2040 SayFilter(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT), 2041 DIR_FILTER), &dcd->mask, FALSE); 2042 } 2043 break; 2044 2045 case IDM_HIDEALL: 2046 if (fAutoView && hwndMain) 2047 PostMsg(hwndMain, UM_LOADFILE, MPVOID, MPVOID); 2048 dcd->suspendview = 1; 2049 HideAll(hwnd); 2050 dcd->suspendview = 0; 2051 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID); 2052 break; 2053 2054 case IDM_SELECTBOTH: 2055 case IDM_SELECTONE: 2056 case IDM_SELECTMORE: 2057 case IDM_SELECTNEWER: 2058 case IDM_SELECTOLDER: 2059 case IDM_SELECTBIGGER: 2060 case IDM_SELECTSMALLER: 2061 case IDM_DESELECTBOTH: 2062 case IDM_DESELECTONE: 2063 case IDM_DESELECTMORE: 2064 case IDM_DESELECTNEWER: 2065 case IDM_DESELECTOLDER: 2066 case IDM_DESELECTBIGGER: 2067 case IDM_DESELECTSMALLER: 2068 if (ParentIsDesktop(hwnd, dcd->hwndParent)) { 2069 Runtime_Error(pszSrcFile, __LINE__, "ParentIsDesktop unexpected"); 2070 break; 2071 } 2072 case IDM_SELECTLIST: 2073 case IDM_SELECTALL: 2074 case IDM_DESELECTALL: 2075 case IDM_SELECTALLFILES: 2076 case IDM_DESELECTALLFILES: 2077 case IDM_SELECTALLDIRS: 2078 case IDM_DESELECTALLDIRS: 2079 case IDM_SELECTMASK: 2080 case IDM_DESELECTMASK: 2081 case IDM_INVERT: 2082 case IDM_SELECTCLIP: 2083 case IDM_DESELECTCLIP: 2084 { 2085 PCNRITEM pci; 2086 2087 pci = (PCNRITEM) CurrentRecord(hwnd); 2088 if ((INT) pci == -1) 2089 pci = NULL; 2090 if (SHORT1FROMMP(mp1) == IDM_HIDEALL) { 2091 if (pci) { 2092 if (!(pci->rc.flRecordAttr & CRA_SELECTED)) 2093 pci->rc.flRecordAttr |= CRA_FILTERED; 2094 WinSendMsg(hwnd, CM_INVALIDATERECORD, MPFROMP(&pci), 2095 MPFROM2SHORT(1, CMA_ERASE | CMA_REPOSITION)); 2096 break; 2097 } 2098 } 2099 PostMsg(dcd->hwndObject, UM_SELECT, mp1, MPFROMP(pci)); 2100 } 2101 break; 2102 2103 case IDM_RESCAN: 2104 DosEnterCritSec(); 2105 dcd->stopflag++; 2106 DosExitCritSec(); 2107 if (!PostMsg(dcd->hwndObject, UM_RESCAN, MPVOID, MPVOID)) { 2108 DosEnterCritSec(); 2109 dcd->stopflag--; 2110 DosExitCritSec(); 2111 } 2112 break; 2113 2114 case IDM_SHOWLNAMES: 2115 case IDM_SHOWSUBJECT: 2116 case IDM_SHOWEAS: 2117 case IDM_SHOWSIZE: 2118 case IDM_SHOWICON: 2119 case IDM_SHOWLWDATE: 2120 case IDM_SHOWLWTIME: 2121 case IDM_SHOWLADATE: 2122 case IDM_SHOWLATIME: 2123 case IDM_SHOWCRDATE: 2124 case IDM_SHOWCRTIME: 2125 case IDM_SHOWATTR: 2126 AdjustDetailsSwitches(hwnd, 2127 dcd->hwndLastMenu, 2128 SHORT1FROMMP(mp1), 2129 dcd->directory, "DirCnr", dcd, FALSE); 2130 break; 2131 2132 case IDM_TREEVIEW: 2133 case IDM_ICON: 2134 case IDM_TEXT: 2135 case IDM_DETAILS: 2136 case IDM_NAME: 2137 case IDM_MINIICONS: 2138 case IDM_DETAILSTITLES: 2139 { 2140 CNRINFO cnri; 2141 2142 memset(&cnri, 0, sizeof(CNRINFO)); 2143 cnri.cb = sizeof(CNRINFO); 2144 WinSendMsg(hwnd, CM_QUERYCNRINFO, MPFROMP(&cnri), 2145 MPFROMLONG(sizeof(CNRINFO))); 2146 switch (SHORT1FROMMP(mp1)) { 2147 case IDM_TREEVIEW: 2148 if (!(cnri.flWindowAttr & CV_TREE)) 2149 dcd->lastattr = cnri.flWindowAttr; 2150 cnri.flWindowAttr &= (~(CV_ICON | CV_TREE | CV_TEXT | 2151 CV_DETAIL | CV_NAME | CA_TREELINE)); 2152 cnri.flWindowAttr |= CA_TREELINE | CV_TREE | CV_ICON; 2153 if (!dcd->firsttree) 2154 PostMsg(dcd->hwndObject, UM_FLESH, MPVOID, MPVOID); 2155 break; 2156 case IDM_ICON: 2157 cnri.flWindowAttr &= (~(CV_ICON | CV_TREE | CV_TEXT | 2158 CV_DETAIL | CV_NAME | CA_TREELINE)); 2159 cnri.flWindowAttr |= CV_ICON; 2160 break; 2161 case IDM_NAME: 2162 cnri.flWindowAttr &= (~(CV_ICON | CV_TREE | CV_TEXT | 2163 CV_DETAIL | CV_NAME | CA_TREELINE)); 2164 cnri.flWindowAttr |= CV_NAME; 2165 break; 2166 case IDM_TEXT: 2167 cnri.flWindowAttr &= (~(CV_ICON | CV_TREE | CV_TEXT | 2168 CV_DETAIL | CV_NAME | CA_TREELINE)); 2169 cnri.flWindowAttr |= CV_TEXT; 2170 break; 2171 case IDM_DETAILS: 2172 cnri.flWindowAttr &= (~(CV_ICON | CV_TREE | CV_TEXT | 2173 CV_DETAIL | CV_NAME | CA_TREELINE)); 2174 cnri.flWindowAttr |= CV_DETAIL; 2175 break; 2176 case IDM_MINIICONS: 2177 if (cnri.flWindowAttr & CV_MINI) 2178 cnri.flWindowAttr &= (~CV_MINI); 2179 else 2180 cnri.flWindowAttr |= CV_MINI; 2181 break; 2182 case IDM_DETAILSTITLES: 2183 if (cnri.flWindowAttr & CA_DETAILSVIEWTITLES) 2184 cnri.flWindowAttr &= (~CA_DETAILSVIEWTITLES); 2185 else 2186 cnri.flWindowAttr |= CA_DETAILSVIEWTITLES; 2187 break; 2188 } 2189 cnri.flWindowAttr &= (~(CA_ORDEREDTARGETEMPH | CA_MIXEDTARGETEMPH)); 2190 cnri.flWindowAttr |= CV_FLOW; 2191 dcd->flWindowAttr = cnri.flWindowAttr; 2192 WinSendMsg(hwnd, CM_SETCNRINFO, MPFROMP(&cnri), 2193 MPFROMLONG(CMA_FLWINDOWATTR)); 2194 WinSendMsg(hwnd, CM_INVALIDATERECORD, MPVOID, 2195 MPFROM2SHORT(0, CMA_ERASE | CMA_REPOSITION)); 2196 SayView(WinWindowFromID(WinQueryWindow(hwnd, QW_PARENT), 2197 DIR_VIEW), dcd->flWindowAttr); 2198 } 2199 break; 2200 2201 case IDM_SAVETOLIST: 2202 WinDlgBox(HWND_DESKTOP, hwnd, SaveListDlgProc, FM3ModHandle, 2203 SAV_FRAME, MPFROMP(&hwnd)); 2204 break; 2205 2206 case IDM_SIZES: 2207 { 2208 PCNRITEM pci; 2209 CHAR path[CCHMAXPATH]; 2210 2211 pci = (PCNRITEM) CurrentRecord(hwnd); 2212 if (pci && (INT) pci != -1) 2213 strcpy(path, pci->szFileName); 2214 else 2215 strcpy(path, dcd->directory); 2216 MakeValidDir(path); 2217 WinDlgBox(HWND_DESKTOP, 2218 HWND_DESKTOP, DirSizeProc, FM3ModHandle, DSZ_FRAME, path); 2219 } 2220 break; 2221 2222 case IDM_MKDIR: 2223 { 2224 PCNRITEM pci; 2225 2226 pci = (PCNRITEM) CurrentRecord(hwnd); 2227 PMMkDir(dcd->hwndParent, 2228 ((pci && (INT) pci != -1) ? 2229 pci->szFileName : dcd->directory), FALSE); 2230 } 2231 break; 2232 2233 case IDM_SWITCH: 2234 if (mp2) { 2235 strcpy(dcd->previous, dcd->directory); 2236 strcpy(dcd->directory, (CHAR *) mp2); 2237 DosEnterCritSec(); 2238 dcd->stopflag++; 2239 DosExitCritSec(); 2240 if (!PostMsg(dcd->hwndObject, UM_RESCAN, MPVOID, MPFROMLONG(1L))) { 2241 strcpy(dcd->directory, dcd->previous); 2242 DosEnterCritSec(); 2243 dcd->stopflag--; 2244 DosExitCritSec(); 2245 } 2246 else if (*dcd->directory) { 2247 if (hwndMain) 2248 WinSendMsg(hwndMain, 2249 UM_SETUSERLISTNAME, MPFROMP(dcd->directory), MPVOID); 2250 else 2251 add_udir(FALSE, dcd->directory); 2252 } 2253 } 2254 break; 2255 2256 case IDM_PARENT: 2257 { 2258 CHAR tempname1[CCHMAXPATH], tempname2[CCHMAXPATH]; 2259 2260 strcpy(tempname1, dcd->directory); 2261 if (tempname1[strlen(tempname1) - 1] != '\\') 2262 strcat(tempname1, "\\"); 2263 strcat(tempname1, ".."); 2264 DosError(FERR_DISABLEHARDERR); 2265 if (!DosQueryPathInfo(tempname1, 2266 FIL_QUERYFULLNAME, 2267 tempname2, sizeof(tempname2))) { 2268 if (stricmp(dcd->directory, tempname2)) { 2269 strcpy(dcd->previous, dcd->directory); 2270 strcpy(dcd->directory, tempname2); 2271 DosEnterCritSec(); 2272 dcd->stopflag++; 2273 DosExitCritSec(); 2274 if (!PostMsg(dcd->hwndObject, 2275 UM_RESCAN, MPVOID, MPFROMLONG(1L))) { 2276 strcpy(dcd->directory, dcd->previous); 2277 DosEnterCritSec(); 2278 dcd->stopflag--; 2279 DosExitCritSec(); 2280 } 2281 else if (*dcd->directory) { 2282 if (hwndMain) 2283 WinSendMsg(hwndMain, 2284 UM_SETUSERLISTNAME, 2285 MPFROMP(dcd->directory), MPVOID); 2286 else 2287 add_udir(FALSE, dcd->directory); 2288 } 2289 } 2290 } 2291 } 2292 break; 2293 2294 case IDM_PREVIOUS: 2295 if (*dcd->previous && stricmp(dcd->directory, dcd->previous)) { 2296 2297 CHAR tempname[CCHMAXPATH]; 2298 2299 if (IsValidDir(dcd->previous)) { 2300 strcpy(tempname, dcd->directory); 2301 strcpy(dcd->directory, dcd->previous); 2302 strcpy(dcd->previous, tempname); 2303 DosEnterCritSec(); 2304 dcd->stopflag++; 2305 DosExitCritSec(); 2306 if (!PostMsg(dcd->hwndObject, UM_RESCAN, MPVOID, MPFROMLONG(1L))) { 2307 strcpy(dcd->directory, dcd->previous); 2308 DosEnterCritSec(); 2309 dcd->stopflag--; 2310 DosExitCritSec(); 2311 } 2312 else if (*dcd->directory) { 2313 if (hwndMain) 2314 WinSendMsg(hwndMain, 2315 UM_SETUSERLISTNAME, 2316 MPFROMP(dcd->directory), MPVOID); 2317 else 2318 add_udir(FALSE, dcd->directory); 2319 } 2320 } 2321 else 2322 *dcd->previous = 0; 2323 } 2324 break; 2325 2326 case IDM_WALKDIR: 2327 { 2328 CHAR newdir[CCHMAXPATH]; 2329 2330 strcpy(newdir, dcd->directory); 2331 if (!WinDlgBox(HWND_DESKTOP, 2332 dcd->hwndParent, 2333 WalkAllDlgProc, 2334 FM3ModHandle, 2335 WALK_FRAME, MPFROMP(newdir)) || !*newdir) 2336 break; 2337 if (stricmp(newdir, dcd->directory)) { 2338 strcpy(dcd->previous, dcd->directory); 2339 strcpy(dcd->directory, newdir); 2340 DosEnterCritSec(); 2341 dcd->stopflag++; 2342 DosExitCritSec(); 2343 if (!PostMsg(dcd->hwndObject, UM_RESCAN, MPVOID, MPFROMLONG(1L))) { 2344 strcpy(dcd->directory, dcd->previous); 2345 DosEnterCritSec(); 2346 dcd->stopflag--; 2347 DosExitCritSec(); 2348 } 2349 else if (*dcd->directory) { 2350 if (hwndMain) 2351 WinSendMsg(hwndMain, 2352 UM_SETUSERLISTNAME, 2353 MPFROMP(dcd->directory), MPVOID); 2354 else 2355 add_udir(FALSE, dcd->directory); 2356 } 2357 } 2358 } 2359 break; 2360 2361 case IDM_OPENICONME: 2362 OpenObject(dcd->directory, "ICON", dcd->hwndFrame); 2363 break; 2364 case IDM_OPENDETAILSME: 2365 OpenObject(dcd->directory, "DETAILS", dcd->hwndFrame); 2366 break; 2367 case IDM_OPENTREEME: 2368 OpenObject(dcd->directory, "TREE", dcd->hwndFrame); 2369 break; 2370 case IDM_OPENSETTINGSME: 2371 OpenObject(dcd->directory, Settings, dcd->hwndFrame); 2372 break; 2373 2374 case IDM_DOITYOURSELF: 2375 case IDM_UPDATE: 2376 case IDM_OPENWINDOW: 2377 case IDM_OPENSETTINGS: 2378 case IDM_OPENDEFAULT: 2379 case IDM_OPENICON: 2380 case IDM_OPENDETAILS: 2381 case IDM_OPENTREE: 2382 case IDM_OBJECT: 2383 case IDM_SHADOW: 2384 case IDM_SHADOW2: 2385 case IDM_DELETE: 2386 case IDM_PERMDELETE: 2387 case IDM_PRINT: 2388 case IDM_ATTRS: 2389 case IDM_INFO: 2390 case IDM_COPY: 2391 case IDM_MOVE: 2392 case IDM_WPSMOVE: 2393 case IDM_WPSCOPY: 2394 case IDM_WILDCOPY: 2395 case IDM_WILDMOVE: 2396 case IDM_RENAME: 2397 case IDM_COMPARE: 2398 case IDM_EAS: 2399 case IDM_SUBJECT: 2400 case IDM_VIEW: 2401 case IDM_VIEWTEXT: 2402 case IDM_VIEWBINARY: 2403 case IDM_VIEWARCHIVE: 2404 case IDM_EDIT: 2405 case IDM_EDITTEXT: 2406 case IDM_EDITBINARY: 2407 case IDM_SAVETOCLIP: 2408 case IDM_APPENDTOCLIP: 2409 case IDM_ARCHIVE: 2410 case IDM_ARCHIVEM: 2411 case IDM_EXTRACT: 2412 case IDM_MCIPLAY: 2413 case IDM_COLLECTFROMFILE: 2414 case IDM_UUDECODE: 2415 case IDM_MERGE: 2416 { 2417 LISTINFO *li; 2418 ULONG action = UM_ACTION; 2419 2420 li = xmallocz(sizeof(LISTINFO), pszSrcFile, __LINE__); 2421 if (li) { 2422 li->type = SHORT1FROMMP(mp1); 2423 li->hwnd = hwnd; 2424 li->list = BuildList(hwnd); 2425 switch (SHORT1FROMMP(mp1)) { 2426 case IDM_WILDMOVE: 2427 case IDM_WILDCOPY: 2428 case IDM_MOVE: 2429 case IDM_COPY: 2430 case IDM_WPSMOVE: 2431 case IDM_WPSCOPY: 2432 break; 2433 default: 2434 strcpy(li->targetpath, dcd->directory); 2435 break; 2436 } 2437 if (li->list) { 2438 if (SHORT1FROMMP(mp1) == IDM_COLLECTFROMFILE) { 2439 if (!Collector) { 2440 2441 HWND hwndC; 2442 SWP swp; 2443 2444 if (!ParentIsDesktop(hwnd, dcd->hwndParent) && 2445 !fAutoTile && 2446 (!fExternalCollector && !strcmp(realappname, FM3Str))) 2447 GetNextWindowPos(dcd->hwndParent, &swp, NULL, NULL); 2448 hwndC = StartCollector((fExternalCollector || 2449 strcmp(realappname, FM3Str)) ? 2450 HWND_DESKTOP : dcd->hwndParent, 4); 2451 if (hwndC) { 2452 if (!ParentIsDesktop(hwnd, dcd->hwndParent) && 2453 !fAutoTile && (!fExternalCollector && 2454 !strcmp(realappname, FM3Str))) 2455 WinSetWindowPos(hwndC, HWND_TOP, swp.x, swp.y, 2456 swp.cx, swp.cy, SWP_MOVE | SWP_SIZE | 2457 SWP_SHOW | SWP_ZORDER); 2458 else if (!ParentIsDesktop(hwnd, dcd->hwndParent) && 2459 fAutoTile && !strcmp(realappname, FM3Str)) 2460 TileChildren(dcd->hwndParent, TRUE); 2461 WinSetWindowPos(hwndC, HWND_TOP, 0, 0, 0, 0, 2462 SWP_ACTIVATE); 2463 DosSleep(250L); 2464 } 2465 } 2466 else 2467 StartCollector(dcd->hwndParent, 4); 2468 } 2469 switch (SHORT1FROMMP(mp1)) { 2470 case IDM_APPENDTOCLIP: 2471 case IDM_SAVETOCLIP: 2472 case IDM_ARCHIVE: 2473 case IDM_ARCHIVEM: 2474 case IDM_DELETE: 2475 case IDM_PERMDELETE: 2476 case IDM_ATTRS: 2477 case IDM_PRINT: 2478 case IDM_SHADOW: 2479 case IDM_SHADOW2: 2480 case IDM_OBJECT: 2481 case IDM_VIEW: 2482 case IDM_VIEWTEXT: 2483 case IDM_VIEWBINARY: 2484 case IDM_EDIT: 2485 case IDM_EDITTEXT: 2486 case IDM_EDITBINARY: 2487 case IDM_MCIPLAY: 2488 case IDM_UPDATE: 2489 case IDM_DOITYOURSELF: 2490 case IDM_INFO: 2491 case IDM_EAS: 2492 action = UM_MASSACTION; 2493 break; 2494 } 2495 if (SHORT1FROMMP(mp1) == IDM_OBJECT || 2496 SHORT1FROMMP(mp1) == IDM_SHADOW || 2497 SHORT1FROMMP(mp1) == IDM_SHADOW2) 2498 *li->targetpath = 0; 2499 if (!PostMsg(dcd->hwndObject, action, MPFROMP(li), MPVOID)) { 2500 Runtime_Error(pszSrcFile, __LINE__, "PostMsg"); 2501 FreeListInfo(li); 2502 } 2503 else if (fUnHilite) 2504 UnHilite(hwnd, TRUE, &dcd->lastselection); 2505 } 2506 else 2507 free(li); 2508 } 2509 } 2510 break; 2511 2512 case IDM_DRIVESMENU: 2513 if (!hwndMain) 2514 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(IDM_WALKDIR, 0), MPVOID); 2515 break; 2516 2517 default: 2518 if (SwitchCommand(dcd->hwndLastMenu, SHORT1FROMMP(mp1))) 2519 return 0; 2520 else { 2521 if (SHORT1FROMMP(mp1) >= IDM_COMMANDSTART && 2522 SHORT1FROMMP(mp1) < IDM_QUICKTOOLSTART) { 2523 2524 register INT x; 2525 2526 if (!cmdloaded) 2527 load_commands(); 2528 x = SHORT1FROMMP(mp1) - IDM_COMMANDSTART; 2529 if (x >= 0) { 2530 x++; 2531 RunCommand(hwnd, x); 2532 if (fUnHilite) 2533 UnHilite(hwnd, TRUE, &dcd->lastselection); 2534 } 2535 } 2536 } 2537 break; 2538 } 2539 } 2540 return 0; 2541 2542 case UM_FIXCNRMLE: 2543 case UM_FIXEDITNAME: 2544 return CommonCnrProc(hwnd, msg, mp1, mp2); 2545 2546 case UM_FILESMENU: 2547 { 2548 PCNRITEM pci; 2549 HWND menuHwnd = (HWND) 0; 2550 2551 pci = (PCNRITEM) CurrentRecord(hwnd); 2552 if (pci && (INT) pci != -1) { 2553 if (pci->attrFile & FILE_DIRECTORY) { 2554 menuHwnd = CheckMenu(&DirMenu, DIR_POPUP); 2555 // WinEnableMenuItem(DirMenu,IDM_TREE,TRUE); 2556 } 2557 else 2558 menuHwnd = CheckMenu(&FileMenu, FILE_POPUP); 2559 } 2560 return MRFROMLONG(menuHwnd); 2561 } 2562 2563 case WM_CONTROL: 2564 DosError(FERR_DISABLEHARDERR); 2565 if (dcd) { 2566 switch (SHORT2FROMMP(mp1)) { 2567 case CN_COLLAPSETREE: 2568 case CN_EXPANDTREE: 2569 { 2570 PCNRITEM pci = (PCNRITEM) mp2; 2571 2572 if (pci && (INT) pci != -1 && !(pci->flags & RECFLAGS_ENV)) { 2573 if (driveflags[toupper(*pci->szFileName) - 'A'] & DRIVE_REMOVABLE) { 2574 struct 2565 2575 { 2566 strcpy(dcd->directory, 2567 dcd->previous); 2568 DosEnterCritSec(); 2569 dcd->stopflag--; 2570 DosExitCritSec(); 2571 } 2572 else if (*dcd->directory) { 2573 if (hwndMain) 2574 WinSendMsg(hwndMain, 2575 UM_SETUSERLISTNAME, 2576 MPFROMP(dcd->directory), 2577 MPVOID); 2578 else 2579 add_udir(FALSE,dcd->directory); 2580 } 2581 } 2582 break; 2583 2584 case IDM_PARENT: 2585 { 2586 CHAR tempname1[CCHMAXPATH], 2587 tempname2[CCHMAXPATH]; 2588 2589 strcpy(tempname1,dcd->directory); 2590 if (tempname1[strlen(tempname1) - 1] != '\\') 2591 strcat(tempname1,"\\"); 2592 strcat(tempname1,".."); 2593 DosError(FERR_DISABLEHARDERR); 2594 if (!DosQueryPathInfo(tempname1, 2595 FIL_QUERYFULLNAME, 2596 tempname2, 2597 sizeof(tempname2))) { 2598 if (stricmp(dcd->directory,tempname2)) { 2599 strcpy(dcd->previous,dcd->directory); 2600 strcpy(dcd->directory,tempname2); 2601 DosEnterCritSec(); 2602 dcd->stopflag++; 2603 DosExitCritSec(); 2604 if (!PostMsg(dcd->hwndObject, 2605 UM_RESCAN, 2606 MPVOID, 2607 MPFROMLONG(1L))) { 2608 strcpy(dcd->directory,dcd->previous); 2609 DosEnterCritSec(); 2610 dcd->stopflag--; 2611 DosExitCritSec(); 2612 } 2613 else if (*dcd->directory) { 2614 if (hwndMain) 2615 WinSendMsg(hwndMain, 2616 UM_SETUSERLISTNAME, 2617 MPFROMP(dcd->directory), 2618 MPVOID); 2619 else 2620 add_udir(FALSE, 2621 dcd->directory); 2622 } 2623 } 2624 } 2625 } 2626 break; 2627 2628 case IDM_PREVIOUS: 2629 if (*dcd->previous && 2630 stricmp(dcd->directory,dcd->previous)) { 2631 2632 CHAR tempname[CCHMAXPATH]; 2633 2634 if (IsValidDir(dcd->previous)) { 2635 strcpy(tempname,dcd->directory); 2636 strcpy(dcd->directory,dcd->previous); 2637 strcpy(dcd->previous,tempname); 2638 DosEnterCritSec(); 2639 dcd->stopflag++; 2640 DosExitCritSec(); 2641 if (!PostMsg(dcd->hwndObject, 2642 UM_RESCAN, 2643 MPVOID, 2644 MPFROMLONG(1L))) { 2645 strcpy(dcd->directory,dcd->previous); 2646 DosEnterCritSec(); 2647 dcd->stopflag--; 2648 DosExitCritSec(); 2649 } 2650 else if (*dcd->directory) { 2651 if (hwndMain) 2652 WinSendMsg(hwndMain, 2653 UM_SETUSERLISTNAME, 2654 MPFROMP(dcd->directory), 2655 MPVOID); 2656 else 2657 add_udir(FALSE, 2658 dcd->directory); 2659 } 2660 } 2661 else 2662 *dcd->previous = 0; 2663 } 2664 break; 2665 2666 case IDM_WALKDIR: 2667 { 2668 CHAR newdir[CCHMAXPATH]; 2669 2670 strcpy(newdir,dcd->directory); 2671 if (!WinDlgBox(HWND_DESKTOP, 2672 dcd->hwndParent, 2673 WalkAllDlgProc, 2674 FM3ModHandle, 2675 WALK_FRAME, 2676 MPFROMP(newdir)) || 2677 !*newdir) 2678 break; 2679 if (stricmp(newdir,dcd->directory)) { 2680 strcpy(dcd->previous,dcd->directory); 2681 strcpy(dcd->directory,newdir); 2682 DosEnterCritSec(); 2683 dcd->stopflag++; 2684 DosExitCritSec(); 2685 if (!PostMsg(dcd->hwndObject, 2686 UM_RESCAN, 2687 MPVOID, 2688 MPFROMLONG(1L))) { 2689 strcpy(dcd->directory,dcd->previous); 2690 DosEnterCritSec(); 2691 dcd->stopflag--; 2692 DosExitCritSec(); 2693 } 2694 else if (*dcd->directory) { 2695 if (hwndMain) 2696 WinSendMsg(hwndMain, 2697 UM_SETUSERLISTNAME, 2698 MPFROMP(dcd->directory), 2699 MPVOID); 2700 else 2701 add_udir(FALSE, 2702 dcd->directory); 2703 } 2704 } 2705 } 2706 break; 2707 2708 case IDM_OPENICONME: 2709 OpenObject(dcd->directory, 2710 "ICON", 2711 dcd->hwndFrame); 2712 break; 2713 case IDM_OPENDETAILSME: 2714 OpenObject(dcd->directory, 2715 "DETAILS", 2716 dcd->hwndFrame); 2717 break; 2718 case IDM_OPENTREEME: 2719 OpenObject(dcd->directory, 2720 "TREE", 2721 dcd->hwndFrame); 2722 break; 2723 case IDM_OPENSETTINGSME: 2724 OpenObject(dcd->directory, 2725 Settings, 2726 dcd->hwndFrame); 2727 break; 2728 2729 case IDM_DOITYOURSELF: 2730 case IDM_UPDATE: 2731 case IDM_OPENWINDOW: 2732 case IDM_OPENSETTINGS: 2733 case IDM_OPENDEFAULT: 2734 case IDM_OPENICON: 2735 case IDM_OPENDETAILS: 2736 case IDM_OPENTREE: 2737 case IDM_OBJECT: 2738 case IDM_SHADOW: 2739 case IDM_SHADOW2: 2740 case IDM_DELETE: 2741 case IDM_PERMDELETE: 2742 case IDM_PRINT: 2743 case IDM_ATTRS: 2744 case IDM_INFO: 2745 case IDM_COPY: 2746 case IDM_MOVE: 2747 case IDM_WPSMOVE: 2748 case IDM_WPSCOPY: 2749 case IDM_WILDCOPY: 2750 case IDM_WILDMOVE: 2751 case IDM_RENAME: 2752 case IDM_COMPARE: 2753 case IDM_EAS: 2754 case IDM_SUBJECT: 2755 case IDM_VIEW: 2756 case IDM_VIEWTEXT: 2757 case IDM_VIEWBINARY: 2758 case IDM_VIEWARCHIVE: 2759 case IDM_EDIT: 2760 case IDM_EDITTEXT: 2761 case IDM_EDITBINARY: 2762 case IDM_SAVETOCLIP: 2763 case IDM_APPENDTOCLIP: 2764 case IDM_ARCHIVE: 2765 case IDM_ARCHIVEM: 2766 case IDM_EXTRACT: 2767 case IDM_MCIPLAY: 2768 case IDM_COLLECTFROMFILE: 2769 case IDM_UUDECODE: 2770 case IDM_MERGE: 2771 { 2772 LISTINFO *li; 2773 ULONG action = UM_ACTION; 2774 2775 li = xmallocz(sizeof(LISTINFO),pszSrcFile,__LINE__); 2776 if (li) { 2777 li->type = SHORT1FROMMP(mp1); 2778 li->hwnd = hwnd; 2779 li->list = BuildList(hwnd); 2780 switch(SHORT1FROMMP(mp1)) { 2781 case IDM_WILDMOVE: 2782 case IDM_WILDCOPY: 2783 case IDM_MOVE: 2784 case IDM_COPY: 2785 case IDM_WPSMOVE: 2786 case IDM_WPSCOPY: 2787 break; 2788 default: 2789 strcpy(li->targetpath,dcd->directory); 2790 break; 2791 } 2792 if (li->list) { 2793 if (SHORT1FROMMP(mp1) == IDM_COLLECTFROMFILE) { 2794 if (!Collector) { 2795 2796 HWND hwndC; 2797 SWP swp; 2798 2799 if (!ParentIsDesktop(hwnd,dcd->hwndParent) && 2800 !fAutoTile && 2801 (!fExternalCollector && !strcmp(realappname,FM3Str))) 2802 GetNextWindowPos(dcd->hwndParent,&swp,NULL,NULL); 2803 hwndC = StartCollector((fExternalCollector || 2804 strcmp(realappname,FM3Str)) ? 2805 HWND_DESKTOP : 2806 dcd->hwndParent,4); 2807 if (hwndC) { 2808 if (!ParentIsDesktop(hwnd,dcd->hwndParent) && 2809 !fAutoTile && (!fExternalCollector && 2810 !strcmp(realappname,FM3Str))) 2811 WinSetWindowPos(hwndC,HWND_TOP,swp.x,swp.y, 2812 swp.cx,swp.cy,SWP_MOVE | SWP_SIZE | 2813 SWP_SHOW | SWP_ZORDER); 2814 else if (!ParentIsDesktop(hwnd,dcd->hwndParent) && 2815 fAutoTile && !strcmp(realappname,FM3Str)) 2816 TileChildren(dcd->hwndParent,TRUE); 2817 WinSetWindowPos(hwndC,HWND_TOP,0,0,0,0,SWP_ACTIVATE); 2818 DosSleep(250L); 2819 } 2820 } 2821 else 2822 StartCollector(dcd->hwndParent,4); 2823 } 2824 switch(SHORT1FROMMP(mp1)) { 2825 case IDM_APPENDTOCLIP: 2826 case IDM_SAVETOCLIP: 2827 case IDM_ARCHIVE: 2828 case IDM_ARCHIVEM: 2829 case IDM_DELETE: 2830 case IDM_PERMDELETE: 2831 case IDM_ATTRS: 2832 case IDM_PRINT: 2833 case IDM_SHADOW: 2834 case IDM_SHADOW2: 2835 case IDM_OBJECT: 2836 case IDM_VIEW: 2837 case IDM_VIEWTEXT: 2838 case IDM_VIEWBINARY: 2839 case IDM_EDIT: 2840 case IDM_EDITTEXT: 2841 case IDM_EDITBINARY: 2842 case IDM_MCIPLAY: 2843 case IDM_UPDATE: 2844 case IDM_DOITYOURSELF: 2845 case IDM_INFO: 2846 case IDM_EAS: 2847 action = UM_MASSACTION; 2848 break; 2849 } 2850 if (SHORT1FROMMP(mp1) == IDM_OBJECT || 2851 SHORT1FROMMP(mp1) == IDM_SHADOW || 2852 SHORT1FROMMP(mp1) == IDM_SHADOW2) 2853 *li->targetpath = 0; 2854 if (!PostMsg(dcd->hwndObject, 2855 action, 2856 MPFROMP(li), 2857 MPVOID)) { 2858 Runtime_Error(pszSrcFile, __LINE__, "PostMsg"); 2859 FreeListInfo(li); 2860 } 2861 else if (fUnHilite) 2862 UnHilite(hwnd, 2863 TRUE, 2864 &dcd->lastselection); 2865 } 2866 else 2867 free(li); 2868 } 2869 } 2870 break; 2871 2872 case IDM_DRIVESMENU: 2873 if (!hwndMain) 2874 PostMsg(hwnd, 2875 WM_COMMAND, 2876 MPFROM2SHORT(IDM_WALKDIR,0), 2877 MPVOID); 2878 break; 2879 2880 default: 2881 if (SwitchCommand(dcd->hwndLastMenu, 2882 SHORT1FROMMP(mp1))) 2883 return 0; 2884 else { 2885 if (SHORT1FROMMP(mp1) >= IDM_COMMANDSTART && 2886 SHORT1FROMMP(mp1) < IDM_QUICKTOOLSTART) { 2887 2888 register INT x; 2889 2890 if (!cmdloaded) 2891 load_commands(); 2892 x = SHORT1FROMMP(mp1) - IDM_COMMANDSTART; 2893 if (x >= 0) { 2894 x++; 2895 RunCommand(hwnd,x); 2896 if (fUnHilite) 2897 UnHilite(hwnd, 2898 TRUE, 2899 &dcd->lastselection); 2900 } 2901 } 2902 } 2903 break; 2904 } 2905 } 2906 return 0; 2907 2908 case UM_FIXCNRMLE: 2909 case UM_FIXEDITNAME: 2910 return CommonCnrProc(hwnd,msg,mp1,mp2); 2911 2912 case UM_FILESMENU: 2913 { 2914 PCNRITEM pci; 2915 HWND menuHwnd = (HWND)0; 2916 2917 pci = (PCNRITEM)CurrentRecord(hwnd); 2918 if (pci && (INT)pci != -1) { 2919 if (pci->attrFile & FILE_DIRECTORY) { 2920 menuHwnd = CheckMenu(&DirMenu, 2921 DIR_POPUP); 2922 // WinEnableMenuItem(DirMenu,IDM_TREE,TRUE); 2923 } 2924 else 2925 menuHwnd = CheckMenu(&FileMenu, 2926 FILE_POPUP); 2927 } 2928 return MRFROMLONG(menuHwnd); 2929 } 2930 2931 case WM_CONTROL: 2932 DosError(FERR_DISABLEHARDERR); 2933 if (dcd) { 2934 switch(SHORT2FROMMP(mp1)) { 2935 case CN_COLLAPSETREE: 2936 case CN_EXPANDTREE: 2937 { 2938 PCNRITEM pci = (PCNRITEM)mp2; 2939 2940 if (pci && 2941 (INT)pci != -1 && 2942 !(pci->flags & RECFLAGS_ENV)) 2943 { 2944 if (driveflags[toupper(*pci->szFileName) - 'A'] & 2945 DRIVE_REMOVABLE) 2946 { 2947 struct { 2948 ULONG serial; 2949 CHAR volumelength; 2950 CHAR volumelabel[CCHMAXPATH]; 2951 } volser; 2952 APIRET rc; 2953 2954 memset(&volser,0,sizeof(volser)); 2955 DosError(FERR_DISABLEHARDERR); 2956 // fixme 2957 rc = DosQueryFSInfo(toupper(*pci->szFileName) - '@', 2958 FSIL_VOLSER, 2959 &volser, 2960 sizeof(volser)); 2961 if (rc) { 2962 Dos_Error(MB_ENTER, 2963 rc, 2964 HWND_DESKTOP, 2965 pszSrcFile, 2966 __LINE__, 2967 // fixme GetPString(IDS_CANTFINDDIRTEXT), 2968 "Can't find drive %s", 2969 pci->szFileName); 2970 // fixme DosBeep(250,100); 2971 driveserial[toupper(*pci->szFileName) - 'A'] = -1; 2972 UnFlesh(hwnd,pci); 2973 PostMsg(hwnd, 2974 UM_RESCAN, 2975 MPVOID, 2976 MPVOID); 2977 } 2978 else { 2979 if (SHORT2FROMMP(mp1) == CN_COLLAPSETREE && 2980 !volser.serial || 2981 driveserial[toupper(*pci->szFileName) - 'A'] != 2982 volser.serial) 2983 UnFlesh(hwnd,pci); 2984 if (SHORT2FROMMP(mp1) != CN_COLLAPSETREE || 2985 (!volser.serial || 2986 driveserial[toupper(*pci->szFileName) - 'A'] != 2987 volser.serial)) { 2988 if (Flesh(hwnd,pci) && 2989 SHORT2FROMMP(mp1) == CN_EXPANDTREE && 2990 !dcd->suspendview && fTopDir) 2991 PostMsg(hwnd,UM_TOPDIR,MPFROMP(pci),MPVOID); 2992 } 2993 driveserial[toupper(*pci->szFileName) - 'A'] = 2994 volser.serial; 2995 } 2996 } 2997 else if (SHORT2FROMMP(mp1) == CN_EXPANDTREE) { 2998 if (Flesh(hwnd,pci) && 2999 !dcd->suspendview && fTopDir) 3000 PostMsg(hwnd, 3001 UM_TOPDIR, 3002 MPFROMP(pci), 3003 MPVOID); 3004 } 3005 if (SHORT2FROMMP(mp1) == CN_EXPANDTREE && 3006 !dcd->suspendview) 3007 WinSendMsg(hwnd, 3008 UM_FILTER, 3009 MPVOID, 3010 MPVOID); 3011 } 3012 } 3013 break; 2576 ULONG serial; 2577 CHAR volumelength; 2578 CHAR volumelabel[CCHMAXPATH]; 2579 } 2580 volser; 2581 APIRET rc; 2582 2583 memset(&volser, 0, sizeof(volser)); 2584 DosError(FERR_DISABLEHARDERR); 2585 // fixme 2586 rc = DosQueryFSInfo(toupper(*pci->szFileName) - '@', 2587 FSIL_VOLSER, &volser, sizeof(volser)); 2588 if (rc) { 2589 Dos_Error(MB_ENTER, rc, HWND_DESKTOP, pszSrcFile, __LINE__, 2590 // fixme GetPString(IDS_CANTFINDDIRTEXT), 2591 "Can't find drive %s", pci->szFileName); 2592 // fixme DosBeep(250,100); 2593 driveserial[toupper(*pci->szFileName) - 'A'] = -1; 2594 UnFlesh(hwnd, pci); 2595 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID); 2596 } 2597 else { 2598 if (SHORT2FROMMP(mp1) == CN_COLLAPSETREE && 2599 !volser.serial || 2600 driveserial[toupper(*pci->szFileName) - 'A'] != 2601 volser.serial) 2602 UnFlesh(hwnd, pci); 2603 if (SHORT2FROMMP(mp1) != CN_COLLAPSETREE || 2604 (!volser.serial || 2605 driveserial[toupper(*pci->szFileName) - 'A'] != 2606 volser.serial)) { 2607 if (Flesh(hwnd, pci) && 2608 SHORT2FROMMP(mp1) == CN_EXPANDTREE && 2609 !dcd->suspendview && fTopDir) 2610 PostMsg(hwnd, UM_TOPDIR, MPFROMP(pci), MPVOID); 2611 } 2612 driveserial[toupper(*pci->szFileName) - 'A'] = volser.serial; 2613 } 2614 } 2615 else if (SHORT2FROMMP(mp1) == CN_EXPANDTREE) { 2616 if (Flesh(hwnd, pci) && !dcd->suspendview && fTopDir) 2617 PostMsg(hwnd, UM_TOPDIR, MPFROMP(pci), MPVOID); 2618 } 2619 if (SHORT2FROMMP(mp1) == CN_EXPANDTREE && !dcd->suspendview) 2620 WinSendMsg(hwnd, UM_FILTER, MPVOID, MPVOID); 2621 } 2622 } 2623 break; 3014 2624 3015 2625 /* … … 3018 2628 */ 3019 2629 3020 case CN_CONTEXTMENU: 3021 { 3022 PCNRITEM pci = (PCNRITEM)mp2; 3023 3024 if (pci) { 3025 WinSendMsg(hwnd, 3026 CM_SETRECORDEMPHASIS, 3027 MPFROMP(pci), 3028 MPFROM2SHORT(TRUE,CRA_CURSORED)); 3029 MarkAll(hwnd, 3030 FALSE, 3031 FALSE, 3032 TRUE); 3033 if (pci->attrFile & FILE_DIRECTORY) 3034 dcd->hwndLastMenu = CheckMenu(&DirMenu,DIR_POPUP); 3035 else 3036 dcd->hwndLastMenu = CheckMenu(&FileMenu,FILE_POPUP); 3037 } 3038 else { 3039 dcd->hwndLastMenu = CheckMenu(&DirCnrMenu,DIRCNR_POPUP); 3040 if (dcd->hwndLastMenu && !dcd->cnremphasized) { 3041 WinSendMsg(hwnd, 3042 CM_SETRECORDEMPHASIS, 3043 MPVOID, 3044 MPFROM2SHORT(TRUE,CRA_SOURCE)); 3045 dcd->cnremphasized = TRUE; 3046 } 3047 } 3048 if (dcd->hwndLastMenu) { 3049 if (dcd->hwndLastMenu == DirCnrMenu) { 3050 if (dcd->flWindowAttr & CV_MINI) 3051 WinCheckMenuItem(dcd->hwndLastMenu, 3052 IDM_MINIICONS, 3053 TRUE); 3054 } 3055 if (dcd->hwndLastMenu == DirMenu) 3056 WinEnableMenuItem(DirMenu, 3057 IDM_TREE, 3058 TRUE); 3059 if (!PopupMenu(hwnd,hwnd,dcd->hwndLastMenu)) { 3060 if (dcd->cnremphasized) { 3061 WinSendMsg(hwnd, 3062 CM_SETRECORDEMPHASIS, 3063 MPVOID, 3064 MPFROM2SHORT(FALSE,CRA_SOURCE)); 3065 dcd->cnremphasized = TRUE; 3066 } 3067 MarkAll(hwnd,TRUE,FALSE,TRUE); 3068 } 3069 } 3070 } 3071 break; 3072 3073 case CN_DROPHELP: 3074 if (mp2) { 3075 3076 PDRAGINFO pDInfo; 3077 PCNRITEM pci; 3078 ULONG numitems; 3079 USHORT usOperation; 3080 3081 pci = (PCNRITEM)((PCNRDRAGINFO)mp2)->pRecord; 3082 pDInfo = (PDRAGINFO)((PCNRDRAGINFO)mp2)->pDragInfo; 3083 if (!DrgAccessDraginfo(pDInfo)) { 3084 Win_Error(hwnd,hwnd,pszSrcFile,__LINE__, 3085 GetPString(IDS_DROPERRORTEXT)); 3086 break; 3087 } 3088 numitems = DrgQueryDragitemCount(pDInfo); 3089 usOperation = pDInfo->usOperation; 3090 DrgDeleteDraginfoStrHandles(pDInfo); 3091 DrgFreeDraginfo(pDInfo); 3092 saymsg(MB_ENTER | MB_ICONASTERISK, 3093 hwnd, 3094 GetPString(IDS_DROPHELPHDRTEXT), 3095 GetPString(IDS_DROPHELPTEXT), 3096 numitems, 3097 &"s"[numitems == 1L], 3098 (pci) ? NullStr : GetPString(IDS_NOTEXT), 3099 (pci) ? NullStr : " ", 3100 (pci) ? pci->szFileName : NullStr, 3101 (pci) ? " " : NullStr, 3102 GetPString((usOperation == DO_COPY) ? 3103 IDS_COPYTEXT : 3104 (usOperation == DO_LINK) ? 3105 IDS_LINKTEXT : IDS_MOVETEXT)); 3106 } 3107 return 0; 3108 3109 case CN_DRAGLEAVE: 2630 case CN_CONTEXTMENU: 2631 { 2632 PCNRITEM pci = (PCNRITEM) mp2; 2633 2634 if (pci) { 2635 WinSendMsg(hwnd, 2636 CM_SETRECORDEMPHASIS, 2637 MPFROMP(pci), MPFROM2SHORT(TRUE, CRA_CURSORED)); 2638 MarkAll(hwnd, FALSE, FALSE, TRUE); 2639 if (pci->attrFile & FILE_DIRECTORY) 2640 dcd->hwndLastMenu = CheckMenu(&DirMenu, DIR_POPUP); 2641 else 2642 dcd->hwndLastMenu = CheckMenu(&FileMenu, FILE_POPUP); 2643 } 2644 else { 2645 dcd->hwndLastMenu = CheckMenu(&DirCnrMenu, DIRCNR_POPUP); 2646 if (dcd->hwndLastMenu && !dcd->cnremphasized) { 2647 WinSendMsg(hwnd, 2648 CM_SETRECORDEMPHASIS, 2649 MPVOID, MPFROM2SHORT(TRUE, CRA_SOURCE)); 2650 dcd->cnremphasized = TRUE; 2651 } 2652 } 2653 if (dcd->hwndLastMenu) { 2654 if (dcd->hwndLastMenu == DirCnrMenu) { 2655 if (dcd->flWindowAttr & CV_MINI) 2656 WinCheckMenuItem(dcd->hwndLastMenu, IDM_MINIICONS, TRUE); 2657 } 2658 if (dcd->hwndLastMenu == DirMenu) 2659 WinEnableMenuItem(DirMenu, IDM_TREE, TRUE); 2660 if (!PopupMenu(hwnd, hwnd, dcd->hwndLastMenu)) { 2661 if (dcd->cnremphasized) { 2662 WinSendMsg(hwnd, 2663 CM_SETRECORDEMPHASIS, 2664 MPVOID, MPFROM2SHORT(FALSE, CRA_SOURCE)); 2665 dcd->cnremphasized = TRUE; 2666 } 2667 MarkAll(hwnd, TRUE, FALSE, TRUE); 2668 } 2669 } 2670 } 2671 break; 2672 2673 case CN_DROPHELP: 2674 if (mp2) { 2675 2676 PDRAGINFO pDInfo; 2677 PCNRITEM pci; 2678 ULONG numitems; 2679 USHORT usOperation; 2680 2681 pci = (PCNRITEM) ((PCNRDRAGINFO) mp2)->pRecord; 2682 pDInfo = (PDRAGINFO) ((PCNRDRAGINFO) mp2)->pDragInfo; 2683 if (!DrgAccessDraginfo(pDInfo)) { 2684 Win_Error(hwnd, hwnd, pszSrcFile, __LINE__, 2685 GetPString(IDS_DROPERRORTEXT)); 2686 break; 2687 } 2688 numitems = DrgQueryDragitemCount(pDInfo); 2689 usOperation = pDInfo->usOperation; 2690 DrgDeleteDraginfoStrHandles(pDInfo); 2691 DrgFreeDraginfo(pDInfo); 2692 saymsg(MB_ENTER | MB_ICONASTERISK, 2693 hwnd, 2694 GetPString(IDS_DROPHELPHDRTEXT), 2695 GetPString(IDS_DROPHELPTEXT), 2696 numitems, 2697 &"s"[numitems == 1L], 2698 (pci) ? NullStr : GetPString(IDS_NOTEXT), 2699 (pci) ? NullStr : " ", 2700 (pci) ? pci->szFileName : NullStr, 2701 (pci) ? " " : NullStr, 2702 GetPString((usOperation == DO_COPY) ? 2703 IDS_COPYTEXT : 2704 (usOperation == DO_LINK) ? 2705 IDS_LINKTEXT : IDS_MOVETEXT)); 2706 } 2707 return 0; 2708 2709 case CN_DRAGLEAVE: 3110 2710 #ifdef NEVER 3111 if (mp2) {3112 3113 PDRAGINFO pDInfo;3114 3115 pDInfo = ((PCNRDRAGINFO)mp2)->pDragInfo;3116 DrgAccessDraginfo(pDInfo);/* Access DRAGINFO */3117 DrgFreeDraginfo(pDInfo);/* Free DRAGINFO */3118 }2711 if (mp2) { 2712 2713 PDRAGINFO pDInfo; 2714 2715 pDInfo = ((PCNRDRAGINFO) mp2)->pDragInfo; 2716 DrgAccessDraginfo(pDInfo); /* Access DRAGINFO */ 2717 DrgFreeDraginfo(pDInfo); /* Free DRAGINFO */ 2718 } 3119 2719 #endif 3120 return 0; 3121 3122 case CN_DRAGAFTER: 3123 case CN_DRAGOVER: 3124 if (mp2) { 3125 3126 PDRAGITEM pDItem; /* Pointer to DRAGITEM */ 3127 PDRAGINFO pDInfo; /* Pointer to DRAGINFO */ 3128 PCNRITEM pci; 3129 USHORT uso; 3130 3131 pci = (PCNRITEM)((PCNRDRAGINFO)mp2)->pRecord; 3132 pDInfo = ((PCNRDRAGINFO)mp2)->pDragInfo; 3133 DrgAccessDraginfo(pDInfo); /* Access DRAGINFO */ 3134 if (*dcd->directory && 3135 (driveflags[toupper(*dcd->directory) - 'A'] & 3136 DRIVE_NOTWRITEABLE)) 3137 { 3138 DrgFreeDraginfo(pDInfo); 3139 return MRFROM2SHORT(DOR_DROP, /* Return okay to link */ 3140 DO_LINK); /* (compare) only */ 3141 } 3142 if (pci) { 3143 if (pci->rc.flRecordAttr & CRA_SOURCE) { 3144 DrgFreeDraginfo(pDInfo); 3145 return(MRFROM2SHORT(DOR_NODROP,0)); 3146 } 3147 uso = pDInfo->usOperation; 3148 if (uso == DO_DEFAULT) 3149 uso = (fCopyDefault) ? DO_COPY : DO_MOVE; 3150 if (!(pci->attrFile & FILE_DIRECTORY)) { 3151 if (uso != DO_LINK && uso != DO_COPY && uso != DO_MOVE) { 3152 DrgFreeDraginfo(pDInfo); 3153 return MRFROM2SHORT(DOR_NODROP,0); 3154 } 3155 if (uso != DO_LINK && 3156 !(driveflags[toupper(*pci->szFileName) - 'A'] & 3157 DRIVE_NOTWRITEABLE)) { 3158 3159 ARC_TYPE *info = NULL; 3160 3161 if (!fQuickArcFind && 3162 !(driveflags[toupper(*pci->szFileName) - 'A'] & 3163 DRIVE_SLOW)) 3164 info = find_type(pci->szFileName,NULL); 3165 else 3166 info = quick_find_type(pci->szFileName,NULL); 3167 if (!info || ((uso == DO_MOVE && !info->move) || 3168 (uso == DO_COPY && !info->create))) { 3169 DrgFreeDraginfo(pDInfo); 3170 return MRFROM2SHORT(DOR_NODROP,0); 3171 } 3172 } 3173 } 3174 } 3175 3176 /* Access DRAGITEM index to DRAGITEM 3177 * Check valid rendering mechanisms and data 3178 */ 3179 pDItem = DrgQueryDragitemPtr(pDInfo,0); 3180 if (DrgVerifyRMF(pDItem, DRM_OS2FILE, NULL) || 3181 ((!pci || (pci->attrFile & FILE_DIRECTORY)) && 3182 DrgVerifyRMF(pDItem, DRM_FM2ARCMEMBER, DRF_FM2ARCHIVE))) 3183 { 3184 /* Free DRAGINFO */ 3185 DrgFreeDraginfo(pDInfo); 3186 if (driveflags[toupper(*dcd->directory) - 'A'] & 3187 DRIVE_NOTWRITEABLE) 3188 return MRFROM2SHORT(DOR_DROP,DO_LINK); 3189 if (toupper(*dcd->directory) < 'C') 3190 return MRFROM2SHORT(DOR_DROP,DO_COPY); 3191 return MRFROM2SHORT(DOR_DROP, /* Return okay to drop */ 3192 ((fCopyDefault) ? 3193 DO_COPY : 3194 DO_MOVE)); 3195 } 3196 DrgFreeDraginfo(pDInfo); /* Free DRAGINFO */ 3197 } 3198 return MRFROM2SHORT(DOR_NODROP,0); /* Drop not valid */ 3199 3200 case CN_INITDRAG: 3201 { 3202 BOOL wasemphasized = FALSE; 3203 PCNRDRAGINIT pcd = (PCNRDRAGINIT)mp2; 3204 PCNRITEM pci; 3205 3206 if (pcd) { 3207 pci = (PCNRITEM)pcd->pRecord; 3208 if (pci) { 3209 if ((INT)pci == -1) 3210 pci = NULL; 3211 else if (pci->rc.flRecordAttr & CRA_SELECTED) 3212 wasemphasized = TRUE; 3213 } 3214 else if (!*dcd->directory) { 3215 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT); 3216 break; 3217 } 3218 else if (IsRoot(dcd->directory)) { 3219 saymsg(MB_ENTER, 3220 hwnd, 3221 GetPString(IDS_ERRORTEXT), 3222 "Can not drag root directory"); // fixme to be GetPString 3223 break; 3224 } 3225 if (hwndStatus2) { 3226 if (pci) 3227 WinSetWindowText(hwndStatus2, 3228 GetPString(IDS_DRAGFILEOBJTEXT)); 3229 else 3230 WinSetWindowText(hwndStatus2, 3231 GetPString(IDS_DRAGDIRTEXT)); 3232 } 3233 if (DoFileDrag(hwnd, 3234 dcd->hwndObject, 3235 mp2, 3236 NULL, 3237 (pci) ? NULL : dcd->directory, 3238 (pci) ? TRUE : FALSE)) 3239 { 3240 if (pci && fUnHilite && wasemphasized) 3241 UnHilite(hwnd, 3242 TRUE, 3243 &dcd->lastselection); 3244 } 3245 if (hwndStatus2) { 3246 WinSetFocus(HWND_DESKTOP,hwnd); 3247 PostMsg(hwnd, 3248 UM_RESCAN, 3249 MPVOID, 3250 MPVOID); 3251 } 3252 } 3253 } 3254 return 0; 3255 3256 case CN_DROP: 3257 if (mp2) { 3258 3259 LISTINFO *li; 3260 ULONG action = UM_ACTION; 3261 3262 li = DoFileDrop(hwnd,dcd->directory,TRUE,mp1,mp2); 3263 if (li) { 3264 if (li->list && li->list[0] && IsRoot(li->list[0])) 3265 li->type = DO_LINK; 3266 else if (fDragndropDlg && (!*li->arcname || !li->info)) { 3267 3268 CHECKLIST cl; 3269 3270 memset(&cl,0,sizeof(cl)); 3271 cl.size = sizeof(cl); 3272 cl.flags = li->type; 3273 cl.list = li->list; 3274 cl.cmd = li->type; 3275 cl.prompt = li->targetpath; 3276 li->type = WinDlgBox(HWND_DESKTOP,dcd->hwndParent, 3277 DropListProc,FM3ModHandle, 3278 DND_FRAME,MPFROMP(&cl)); 3279 if (!li->type) { 3280 FreeListInfo(li); 3281 return 0; 3282 } 3283 li->list = cl.list; 3284 if (!li->list || !li->list[0]) { 3285 FreeListInfo(li); 3286 return 0; 3287 } 3288 } 3289 switch(li->type) { 3290 case DND_LAUNCH: 3291 strcat(li->targetpath," %a"); 3292 ExecOnList(dcd->hwndParent,li->targetpath, 3293 PROMPT | WINDOWED,NULL,li->list,NULL); 3294 FreeList(li->list); 3295 li->list = NULL; 3296 break; 3297 case DO_LINK: 3298 if (fLinkSetsIcon) { 3299 li->type = IDM_SETICON; 3300 action = UM_MASSACTION; 3301 } 3302 else 3303 li->type = IDM_COMPARE; 3304 break; 3305 case DND_EXTRACT: 3306 if (*li->targetpath && !IsFile(li->targetpath)) 3307 li->type = IDM_EXTRACT; 3308 break; 3309 case DND_MOVE: 3310 li->type = IDM_MOVE; 3311 if (*li->targetpath && IsFile(li->targetpath) == 1) { 3312 action = UM_MASSACTION; 3313 li->type = IDM_ARCHIVEM; 3314 } 3315 break; 3316 case DND_WILDMOVE: 3317 li->type = IDM_WILDMOVE; 3318 if (*li->targetpath && IsFile(li->targetpath) == 1) { 3319 action = UM_MASSACTION; 3320 li->type = IDM_ARCHIVEM; 3321 } 3322 break; 3323 case DND_OBJECT: 3324 li->type = IDM_OBJECT; 3325 action = UM_MASSACTION; 3326 break; 3327 case DND_SHADOW: 3328 li->type = IDM_SHADOW; 3329 action = UM_MASSACTION; 3330 break; 3331 case DND_COMPARE: 3332 li->type = IDM_COMPARE; 3333 break; 3334 case DND_SETICON: 3335 action = UM_MASSACTION; 3336 li->type = IDM_SETICON; 3337 break; 3338 case DND_COPY: 3339 li->type = IDM_COPY; 3340 if (*li->targetpath && IsFile(li->targetpath) == 1) { 3341 action = UM_MASSACTION; 3342 li->type = IDM_ARCHIVE; 3343 } 3344 break; 3345 case DND_WILDCOPY: 3346 li->type = IDM_WILDCOPY; 3347 if (*li->targetpath && IsFile(li->targetpath) == 1) { 3348 action = UM_MASSACTION; 3349 li->type = IDM_ARCHIVE; 3350 } 3351 break; 3352 default: 3353 if (*li->arcname && li->info) { 3354 action = UM_MASSACTION; 3355 li->type = (li->type == DO_MOVE) ? IDM_FAKEEXTRACTM : IDM_FAKEEXTRACT; 3356 } 3357 else if (*li->targetpath && IsFile(li->targetpath) == 1) { 3358 action = UM_MASSACTION; 3359 li->type = (li->type == DO_MOVE) ? IDM_ARCHIVEM : IDM_ARCHIVE; 3360 } 3361 else 3362 li->type = (li->type == DO_MOVE) ? IDM_MOVE : IDM_COPY; 3363 break; 3364 } 3365 if (!li->list || !li->list[0]) 3366 FreeListInfo(li); 3367 else if (!PostMsg(dcd->hwndObject,action,MPFROMP(li),MPVOID)) 3368 FreeListInfo(li); 3369 else { 3370 3371 USHORT usop = 0; 3372 3373 switch(li->type) { 3374 case IDM_COPY: 3375 case IDM_WILDCOPY: 3376 usop = DO_COPY; 3377 break; 3378 case IDM_MOVE: 3379 case IDM_WILDMOVE: 3380 case IDM_ARCHIVEM: 3381 usop = DO_MOVE; 3382 break; 3383 } 3384 if (usop) 3385 return MRFROM2SHORT(DOR_DROP,usop); 3386 } 3387 } 3388 } 3389 return 0; 3390 3391 case CN_ENDEDIT: 3392 case CN_BEGINEDIT: 3393 { 3394 PFIELDINFO pfi = ((PCNREDITDATA)mp2)->pFieldInfo; 3395 PCNRITEM pci = (PCNRITEM)((PCNREDITDATA)mp2)->pRecord; 3396 3397 if (pfi || pci) { 3398 3399 MRESULT mre; 3400 3401 mre = CnrDirectEdit(hwnd,msg,mp1,mp2); 3402 if (mre != (MRESULT)-1) 3403 return mre; 3404 } 3405 else if (!pfi && !pci) 3406 PostMsg(hwnd, 3407 UM_FIXCNRMLE, 3408 MPFROMLONG(CCHMAXPATH), 3409 MPVOID); 3410 } 3411 return 0; 3412 3413 case CN_REALLOCPSZ: 3414 { 3415 PFIELDINFO pfi = ((PCNREDITDATA)mp2)->pFieldInfo; 3416 PCNRITEM pci = (PCNRITEM)((PCNREDITDATA)mp2)->pRecord; 3417 HWND hwndMLE; 3418 static CHAR szData[CCHMAXPATH]; 3419 CHAR testname[CCHMAXPATH],*p; 3420 3421 if (!pci && !pfi) { 3422 hwndMLE = WinWindowFromID(hwnd,CID_MLE); 3423 WinQueryWindowText(hwndMLE, 3424 sizeof(szData), 3425 szData); 3426 chop_at_crnl(szData); 3427 bstrip(szData); 3428 if (*szData) { 3429 if (!DosQueryPathInfo(szData, 3430 FIL_QUERYFULLNAME, 3431 testname, 3432 sizeof(testname))) 3433 { 3434 if (!SetDir(dcd->hwndParent, 3435 hwnd, 3436 testname, 3437 1)) 3438 { 3439 PostMsg(hwnd, 3440 UM_SETDIR, 3441 MPFROMP(testname), 3442 MPVOID); 2720 return 0; 2721 2722 case CN_DRAGAFTER: 2723 case CN_DRAGOVER: 2724 if (mp2) { 2725 2726 PDRAGITEM pDItem; /* Pointer to DRAGITEM */ 2727 PDRAGINFO pDInfo; /* Pointer to DRAGINFO */ 2728 PCNRITEM pci; 2729 USHORT uso; 2730 2731 pci = (PCNRITEM) ((PCNRDRAGINFO) mp2)->pRecord; 2732 pDInfo = ((PCNRDRAGINFO) mp2)->pDragInfo; 2733 DrgAccessDraginfo(pDInfo); /* Access DRAGINFO */ 2734 if (*dcd->directory && 2735 (driveflags[toupper(*dcd->directory) - 'A'] & 2736 DRIVE_NOTWRITEABLE)) { 2737 DrgFreeDraginfo(pDInfo); 2738 return MRFROM2SHORT(DOR_DROP, /* Return okay to link */ 2739 DO_LINK); /* (compare) only */ 2740 } 2741 if (pci) { 2742 if (pci->rc.flRecordAttr & CRA_SOURCE) { 2743 DrgFreeDraginfo(pDInfo); 2744 return (MRFROM2SHORT(DOR_NODROP, 0)); 2745 } 2746 uso = pDInfo->usOperation; 2747 if (uso == DO_DEFAULT) 2748 uso = (fCopyDefault) ? DO_COPY : DO_MOVE; 2749 if (!(pci->attrFile & FILE_DIRECTORY)) { 2750 if (uso != DO_LINK && uso != DO_COPY && uso != DO_MOVE) { 2751 DrgFreeDraginfo(pDInfo); 2752 return MRFROM2SHORT(DOR_NODROP, 0); 2753 } 2754 if (uso != DO_LINK && 2755 !(driveflags[toupper(*pci->szFileName) - 'A'] & 2756 DRIVE_NOTWRITEABLE)) { 2757 2758 ARC_TYPE *info = NULL; 2759 2760 if (!fQuickArcFind && 2761 !(driveflags[toupper(*pci->szFileName) - 'A'] & 2762 DRIVE_SLOW)) 2763 info = find_type(pci->szFileName, NULL); 2764 else 2765 info = quick_find_type(pci->szFileName, NULL); 2766 if (!info || ((uso == DO_MOVE && !info->move) || 2767 (uso == DO_COPY && !info->create))) { 2768 DrgFreeDraginfo(pDInfo); 2769 return MRFROM2SHORT(DOR_NODROP, 0); 2770 } 2771 } 2772 } 2773 } 2774 2775 /* Access DRAGITEM index to DRAGITEM 2776 * Check valid rendering mechanisms and data 2777 */ 2778 pDItem = DrgQueryDragitemPtr(pDInfo, 0); 2779 if (DrgVerifyRMF(pDItem, DRM_OS2FILE, NULL) || 2780 ((!pci || (pci->attrFile & FILE_DIRECTORY)) && 2781 DrgVerifyRMF(pDItem, DRM_FM2ARCMEMBER, DRF_FM2ARCHIVE))) { 2782 /* Free DRAGINFO */ 2783 DrgFreeDraginfo(pDInfo); 2784 if (driveflags[toupper(*dcd->directory) - 'A'] & 2785 DRIVE_NOTWRITEABLE) 2786 return MRFROM2SHORT(DOR_DROP, DO_LINK); 2787 if (toupper(*dcd->directory) < 'C') 2788 return MRFROM2SHORT(DOR_DROP, DO_COPY); 2789 return MRFROM2SHORT(DOR_DROP, /* Return okay to drop */ 2790 ((fCopyDefault) ? DO_COPY : DO_MOVE)); 2791 } 2792 DrgFreeDraginfo(pDInfo); /* Free DRAGINFO */ 2793 } 2794 return MRFROM2SHORT(DOR_NODROP, 0); /* Drop not valid */ 2795 2796 case CN_INITDRAG: 2797 { 2798 BOOL wasemphasized = FALSE; 2799 PCNRDRAGINIT pcd = (PCNRDRAGINIT) mp2; 2800 PCNRITEM pci; 2801 2802 if (pcd) { 2803 pci = (PCNRITEM) pcd->pRecord; 2804 if (pci) { 2805 if ((INT) pci == -1) 2806 pci = NULL; 2807 else if (pci->rc.flRecordAttr & CRA_SELECTED) 2808 wasemphasized = TRUE; 2809 } 2810 else if (!*dcd->directory) { 2811 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT); 2812 break; 2813 } 2814 else if (IsRoot(dcd->directory)) { 2815 saymsg(MB_ENTER, hwnd, GetPString(IDS_ERRORTEXT), "Can not drag root directory"); // fixme to be GetPString 2816 break; 2817 } 2818 if (hwndStatus2) { 2819 if (pci) 2820 WinSetWindowText(hwndStatus2, 2821 GetPString(IDS_DRAGFILEOBJTEXT)); 2822 else 2823 WinSetWindowText(hwndStatus2, GetPString(IDS_DRAGDIRTEXT)); 2824 } 2825 if (DoFileDrag(hwnd, 2826 dcd->hwndObject, 2827 mp2, 2828 NULL, 2829 (pci) ? NULL : dcd->directory, 2830 (pci) ? TRUE : FALSE)) { 2831 if (pci && fUnHilite && wasemphasized) 2832 UnHilite(hwnd, TRUE, &dcd->lastselection); 2833 } 2834 if (hwndStatus2) { 2835 WinSetFocus(HWND_DESKTOP, hwnd); 2836 PostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID); 2837 } 2838 } 2839 } 2840 return 0; 2841 2842 case CN_DROP: 2843 if (mp2) { 2844 2845 LISTINFO *li; 2846 ULONG action = UM_ACTION; 2847 2848 li = DoFileDrop(hwnd, dcd->directory, TRUE, mp1, mp2); 2849 if (li) { 2850 if (li->list && li->list[0] && IsRoot(li->list[0])) 2851 li->type = DO_LINK; 2852 else if (fDragndropDlg && (!*li->arcname || !li->info)) { 2853 2854 CHECKLIST cl; 2855 2856 memset(&cl, 0, sizeof(cl)); 2857 cl.size = sizeof(cl); 2858 cl.flags = li->type; 2859 cl.list = li->list; 2860 cl.cmd = li->type; 2861 cl.prompt = li->targetpath; 2862 li->type = WinDlgBox(HWND_DESKTOP, dcd->hwndParent, 2863 DropListProc, FM3ModHandle, 2864 DND_FRAME, MPFROMP(&cl)); 2865 if (!li->type) { 2866 FreeListInfo(li); 2867 return 0; 2868 } 2869 li->list = cl.list; 2870 if (!li->list || !li->list[0]) { 2871 FreeListInfo(li); 2872 return 0; 2873 } 2874 } 2875 switch (li->type) { 2876 case DND_LAUNCH: 2877 strcat(li->targetpath, " %a"); 2878 ExecOnList(dcd->hwndParent, li->targetpath, 2879 PROMPT | WINDOWED, NULL, li->list, NULL); 2880 FreeList(li->list); 2881 li->list = NULL; 2882 break; 2883 case DO_LINK: 2884 if (fLinkSetsIcon) { 2885 li->type = IDM_SETICON; 2886 action = UM_MASSACTION; 2887 } 2888 else 2889 li->type = IDM_COMPARE; 2890 break; 2891 case DND_EXTRACT: 2892 if (*li->targetpath && !IsFile(li->targetpath)) 2893 li->type = IDM_EXTRACT; 2894 break; 2895 case DND_MOVE: 2896 li->type = IDM_MOVE; 2897 if (*li->targetpath && IsFile(li->targetpath) == 1) { 2898 action = UM_MASSACTION; 2899 li->type = IDM_ARCHIVEM; 2900 } 2901 break; 2902 case DND_WILDMOVE: 2903 li->type = IDM_WILDMOVE; 2904 if (*li->targetpath && IsFile(li->targetpath) == 1) { 2905 action = UM_MASSACTION; 2906 li->type = IDM_ARCHIVEM; 2907 } 2908 break; 2909 case DND_OBJECT: 2910 li->type = IDM_OBJECT; 2911 action = UM_MASSACTION; 2912 break; 2913 case DND_SHADOW: 2914 li->type = IDM_SHADOW; 2915 action = UM_MASSACTION; 2916 break; 2917 case DND_COMPARE: 2918 li->type = IDM_COMPARE; 2919 break; 2920 case DND_SETICON: 2921 action = UM_MASSACTION; 2922 li->type = IDM_SETICON; 2923 break; 2924 case DND_COPY: 2925 li->type = IDM_COPY; 2926 if (*li->targetpath && IsFile(li->targetpath) == 1) { 2927 action = UM_MASSACTION; 2928 li->type = IDM_ARCHIVE; 2929 } 2930 break; 2931 case DND_WILDCOPY: 2932 li->type = IDM_WILDCOPY; 2933 if (*li->targetpath && IsFile(li->targetpath) == 1) { 2934 action = UM_MASSACTION; 2935 li->type = IDM_ARCHIVE; 2936 } 2937 break; 2938 default: 2939 if (*li->arcname && li->info) { 2940 action = UM_MASSACTION; 2941 li->type = 2942 (li->type == DO_MOVE) ? IDM_FAKEEXTRACTM : IDM_FAKEEXTRACT; 2943 } 2944 else if (*li->targetpath && IsFile(li->targetpath) == 1) { 2945 action = UM_MASSACTION; 2946 li->type = (li->type == DO_MOVE) ? IDM_ARCHIVEM : IDM_ARCHIVE; 2947 } 2948 else 2949 li->type = (li->type == DO_MOVE) ? IDM_MOVE : IDM_COPY; 2950 break; 2951 } 2952 if (!li->list || !li->list[0]) 2953 FreeListInfo(li); 2954 else if (!PostMsg(dcd->hwndObject, action, MPFROMP(li), MPVOID)) 2955 FreeListInfo(li); 2956 else { 2957 2958 USHORT usop = 0; 2959 2960 switch (li->type) { 2961 case IDM_COPY: 2962 case IDM_WILDCOPY: 2963 usop = DO_COPY; 2964 break; 2965 case IDM_MOVE: 2966 case IDM_WILDMOVE: 2967 case IDM_ARCHIVEM: 2968 usop = DO_MOVE; 2969 break; 2970 } 2971 if (usop) 2972 return MRFROM2SHORT(DOR_DROP, usop); 2973 } 2974 } 2975 } 2976 return 0; 2977 2978 case CN_ENDEDIT: 2979 case CN_BEGINEDIT: 2980 { 2981 PFIELDINFO pfi = ((PCNREDITDATA) mp2)->pFieldInfo; 2982 PCNRITEM pci = (PCNRITEM) ((PCNREDITDATA) mp2)->pRecord; 2983 2984 if (pfi || pci) { 2985 2986 MRESULT mre; 2987 2988 mre = CnrDirectEdit(hwnd, msg, mp1, mp2); 2989 if (mre != (MRESULT) - 1) 2990 return mre; 2991 } 2992 else if (!pfi && !pci) 2993 PostMsg(hwnd, UM_FIXCNRMLE, MPFROMLONG(CCHMAXPATH), MPVOID); 2994 } 2995 return 0; 2996 2997 case CN_REALLOCPSZ: 2998 { 2999 PFIELDINFO pfi = ((PCNREDITDATA) mp2)->pFieldInfo; 3000 PCNRITEM pci = (PCNRITEM) ((PCNREDITDATA) mp2)->pRecord; 3001 HWND hwndMLE; 3002 static CHAR szData[CCHMAXPATH]; 3003 CHAR testname[CCHMAXPATH], *p; 3004 3005 if (!pci && !pfi) { 3006 hwndMLE = WinWindowFromID(hwnd, CID_MLE); 3007 WinQueryWindowText(hwndMLE, sizeof(szData), szData); 3008 chop_at_crnl(szData); 3009 bstrip(szData); 3010 if (*szData) { 3011 if (!DosQueryPathInfo(szData, 3012 FIL_QUERYFULLNAME, 3013 testname, sizeof(testname))) { 3014 if (!SetDir(dcd->hwndParent, hwnd, testname, 1)) { 3015 PostMsg(hwnd, UM_SETDIR, MPFROMP(testname), MPVOID); 3016 } 3017 } 3018 } 3019 } 3020 else { 3021 3022 MRESULT mre; 3023 3024 mre = CnrDirectEdit(hwnd, msg, mp1, mp2); 3025 if (mre != (MRESULT) - 1) 3026 return mre; 3027 } 3028 } 3029 return 0; 3030 3031 case CN_EMPHASIS: 3032 if (!mp2) 3033 Runtime_Error(pszSrcFile, __LINE__, "mp2 NULL"); 3034 else { 3035 PNOTIFYRECORDEMPHASIS pre = mp2; 3036 PCNRITEM pci; 3037 CHAR s[CCHMAXPATHCOMP + 91], tb[81], tf[81]; 3038 3039 pci = (PCNRITEM) ((pre) ? pre->pRecord : NULL); 3040 if (!pci) { 3041 if (hwndStatus2) 3042 WinSetWindowText(hwndStatus2, NullStr); 3043 if (fMoreButtons) { 3044 WinSetWindowText(hwndName, NullStr); 3045 WinSetWindowText(hwndDate, NullStr); 3046 WinSetWindowText(hwndAttr, NullStr); 3047 } 3048 if (hwndMain) 3049 WinSendMsg(hwndMain, UM_LOADFILE, MPVOID, MPVOID); 3050 break; 3051 } 3052 if (pre->fEmphasisMask & CRA_SELECTED) { 3053 if (pci->rc.flRecordAttr & CRA_SELECTED) { 3054 dcd->selectedbytes += (pci->cbFile + pci->easize); 3055 dcd->selectedfiles++; 3056 } 3057 else if (dcd->selectedfiles) { 3058 dcd->selectedbytes -= (pci->cbFile + pci->easize); 3059 dcd->selectedfiles--; 3060 } 3061 if (!dcd->suspendview) { 3062 commafmt(tf, sizeof(tf), dcd->selectedfiles); 3063 CommaFmtULL(tb, sizeof(tb), dcd->selectedbytes, 'K'); 3064 sprintf(s, "%s / %s", tf, tb); 3065 WinSetDlgItemText(dcd->hwndClient, DIR_SELECTED, s); 3066 } 3067 } 3068 if (!dcd->suspendview && hwndMain && 3069 (pre->fEmphasisMask & CRA_CURSORED) && 3070 (pci->rc.flRecordAttr & CRA_CURSORED) && 3071 WinQueryActiveWindow(dcd->hwndParent) == dcd->hwndFrame) { 3072 if (driveflags[toupper(*pci->szFileName) - 'A'] & DRIVE_SLOW) 3073 WinSendMsg(hwndMain, UM_LOADFILE, MPVOID, MPVOID); 3074 else 3075 WinSendMsg(hwndMain, 3076 UM_LOADFILE, MPFROMP(pci->szFileName), MPVOID); 3077 } 3078 if (!dcd->suspendview && 3079 WinQueryActiveWindow(dcd->hwndParent) == dcd->hwndFrame) { 3080 if (pre->fEmphasisMask & CRA_CURSORED) { 3081 if (pci->rc.flRecordAttr & CRA_CURSORED) { 3082 if (fSplitStatus && hwndStatus2) { 3083 CommaFmtULL(tb, sizeof(tb), pci->cbFile + pci->easize, ' '); 3084 if (!fMoreButtons) { 3085 sprintf(s, " %s %04u/%02u/%02u %02u:%02u:%02u [%s] %s", 3086 tb, pci->date.year, 3087 pci->date.month, pci->date.day, pci->time.hours, 3088 pci->time.minutes, pci->time.seconds, 3089 pci->pszDispAttr, pci->pszFileName); 3090 } 3091 else { 3092 *tf = 0; 3093 if (pci->cbFile + pci->easize > 1024) { 3094 CommaFmtULL(tf, sizeof(tf), 3095 pci->cbFile + pci->easize, 'K'); 3443 3096 } 3444 } 3445 } 3446 } 3447 else { 3448 3449 MRESULT mre; 3450 3451 mre = CnrDirectEdit(hwnd,msg,mp1,mp2); 3452 if (mre != (MRESULT)-1) 3453 return mre; 3454 } 3455 } 3456 return 0; 3457 3458 case CN_EMPHASIS: 3459 if (!mp2) 3460 Runtime_Error(pszSrcFile, __LINE__, "mp2 NULL"); 3097 sprintf(s, GetPString(IDS_STATUSSIZETEXT), 3098 tb, 3099 *tf ? " (" : NullStr, tf, *tf ? ")" : NullStr); 3100 } 3101 WinSetWindowText(hwndStatus2, s); 3102 } 3103 if (fMoreButtons) { 3104 WinSetWindowText(hwndName, pci->pszFileName); 3105 sprintf(s, "%04u/%02u/%02u %02u:%02u:%02u", 3106 pci->date.year, pci->date.month, 3107 pci->date.day, pci->time.hours, pci->time.minutes, 3108 pci->time.seconds); 3109 WinSetWindowText(hwndDate, s); 3110 WinSetWindowText(hwndAttr, pci->pszDispAttr); 3111 } 3112 } 3113 } 3114 } 3115 } 3116 break; 3117 3118 case CN_ENTER: 3119 if (mp2) { 3120 3121 PCNRITEM pci = (PCNRITEM) ((PNOTIFYRECORDENTER) mp2)->pRecord; 3122 FILEFINDBUF3 ffb; 3123 HDIR hDir = HDIR_CREATE; 3124 ULONG nm = 1L; 3125 APIRET status = 0; 3126 3127 SetShiftState(); 3128 if (pci) { 3129 if (pci->rc.flRecordAttr & CRA_INUSE) 3130 break; 3131 DosError(FERR_DISABLEHARDERR); 3132 status = DosFindFirst(pci->szFileName, 3133 &hDir, 3134 FILE_NORMAL | FILE_DIRECTORY | 3135 FILE_ARCHIVED | FILE_READONLY | 3136 FILE_HIDDEN | FILE_SYSTEM, 3137 &ffb, sizeof(ffb), &nm, FIL_STANDARD); 3138 priority_bumped(); 3139 if (!status) { 3140 DosFindClose(hDir); 3141 if (ffb.attrFile & FILE_DIRECTORY) { 3142 if ((shiftstate & (KC_CTRL | KC_ALT)) == (KC_CTRL | KC_ALT)) 3143 PostMsg(hwnd, 3144 WM_COMMAND, 3145 MPFROM2SHORT(IDM_SHOWALLFILES, 0), MPVOID); 3146 else if ((shiftstate & (KC_CTRL | KC_SHIFT)) == 3147 (KC_CTRL | KC_SHIFT)) 3148 OpenObject(pci->szFileName, Settings, dcd->hwndFrame); 3149 else if (shiftstate & KC_CTRL) 3150 OpenObject(pci->szFileName, Default, dcd->hwndFrame); 3151 else if (shiftstate & KC_SHIFT) { 3152 3153 HWND hwndDir; 3154 3155 hwndDir = OpenDirCnr((HWND) 0, 3156 dcd->hwndParent, 3157 dcd->hwndFrame, 3158 FALSE, pci->szFileName); 3159 if (hwndDir) { 3160 if (fMinOnOpen) 3161 WinSetWindowPos(dcd->hwndFrame, 3162 HWND_BOTTOM, 3163 0, 0, 0, 0, SWP_MINIMIZE | SWP_ZORDER); 3164 if (fAutoTile) 3165 TileChildren(dcd->hwndParent, TRUE); 3166 WinSetWindowPos(hwndDir, 3167 HWND_TOP, 0, 0, 0, 0, SWP_ACTIVATE); 3168 } 3169 } 3170 else { 3171 strcpy(dcd->previous, dcd->directory); 3172 strcpy(dcd->directory, pci->szFileName); 3173 DosEnterCritSec(); 3174 dcd->stopflag++; 3175 DosExitCritSec(); 3176 if (!PostMsg(dcd->hwndObject, 3177 UM_RESCAN, MPVOID, MPFROMLONG(1L))) { 3178 DosEnterCritSec(); 3179 dcd->stopflag--; 3180 DosExitCritSec(); 3181 } 3182 else if (*dcd->directory) { 3183 if (hwndMain) 3184 WinSendMsg(hwndMain, 3185 UM_SETUSERLISTNAME, 3186 MPFROMP(dcd->directory), MPVOID); 3187 else 3188 add_udir(FALSE, dcd->directory); 3189 } 3190 } 3191 } 3192 else { 3193 3194 SWP swp; 3195 3196 WinQueryWindowPos(dcd->hwndFrame, &swp); 3197 WinSendMsg(hwnd, 3198 CM_SETRECORDEMPHASIS, 3199 MPFROMP(pci), MPFROM2SHORT(TRUE, CRA_INUSE)); 3200 DefaultViewKeys(hwnd, 3201 dcd->hwndFrame, 3202 dcd->hwndParent, &swp, pci->szFileName); 3203 WinSendMsg(hwnd, 3204 CM_SETRECORDEMPHASIS, 3205 MPFROMP(pci), 3206 MPFROM2SHORT(FALSE, 3207 CRA_INUSE | 3208 ((fUnHilite) ? CRA_SELECTED : 0))); 3209 } 3210 } 3461 3211 else { 3462 PNOTIFYRECORDEMPHASIS pre = mp2; 3463 PCNRITEM pci; 3464 CHAR s[CCHMAXPATHCOMP + 91],tb[81],tf[81]; 3465 3466 pci = (PCNRITEM)((pre) ? pre->pRecord : NULL); 3467 if (!pci) { 3468 if (hwndStatus2) 3469 WinSetWindowText(hwndStatus2,NullStr); 3470 if (fMoreButtons) { 3471 WinSetWindowText(hwndName,NullStr); 3472 WinSetWindowText(hwndDate,NullStr); 3473 WinSetWindowText(hwndAttr,NullStr); 3474 } 3475 if (hwndMain) 3476 WinSendMsg(hwndMain, 3477 UM_LOADFILE, 3478 MPVOID, 3479 MPVOID); 3480 break; 3481 } 3482 if (pre->fEmphasisMask & CRA_SELECTED) { 3483 if (pci->rc.flRecordAttr & CRA_SELECTED) { 3484 dcd->selectedbytes += (pci->cbFile + pci->easize); 3485 dcd->selectedfiles++; 3486 } 3487 else if (dcd->selectedfiles) { 3488 dcd->selectedbytes -= (pci->cbFile + pci->easize); 3489 dcd->selectedfiles--; 3490 } 3491 if (!dcd->suspendview) 3492 { 3493 commafmt(tf,sizeof(tf),dcd->selectedfiles); 3494 CommaFmtULL(tb,sizeof(tb),dcd->selectedbytes,'K'); 3495 sprintf(s,"%s / %s",tf,tb); 3496 WinSetDlgItemText(dcd->hwndClient,DIR_SELECTED,s); 3497 } 3498 } 3499 if (!dcd->suspendview && hwndMain && 3500 (pre->fEmphasisMask & CRA_CURSORED) && 3501 (pci->rc.flRecordAttr & CRA_CURSORED) && 3502 WinQueryActiveWindow(dcd->hwndParent) == dcd->hwndFrame) 3503 { 3504 if (driveflags[toupper(*pci->szFileName) - 'A'] & DRIVE_SLOW) 3505 WinSendMsg(hwndMain, 3506 UM_LOADFILE, 3507 MPVOID, 3508 MPVOID); 3509 else 3510 WinSendMsg(hwndMain, 3511 UM_LOADFILE, 3512 MPFROMP(pci->szFileName), 3513 MPVOID); 3514 } 3515 if (!dcd->suspendview && 3516 WinQueryActiveWindow(dcd->hwndParent) == dcd->hwndFrame) { 3517 if (pre->fEmphasisMask & CRA_CURSORED) { 3518 if (pci->rc.flRecordAttr & CRA_CURSORED) { 3519 if (fSplitStatus && hwndStatus2) 3520 { 3521 CommaFmtULL(tb,sizeof(tb),pci->cbFile + pci->easize,' '); 3522 if (!fMoreButtons) 3523 { 3524 sprintf(s," %s %04u/%02u/%02u %02u:%02u:%02u [%s] %s", 3525 tb,pci->date.year, 3526 pci->date.month,pci->date.day,pci->time.hours, 3527 pci->time.minutes,pci->time.seconds, 3528 pci->pszDispAttr,pci->pszFileName); 3529 } 3530 else { 3531 *tf = 0; 3532 if (pci->cbFile + pci->easize > 1024) 3533 { 3534 CommaFmtULL(tf,sizeof(tf), 3535 pci->cbFile + pci->easize,'K'); 3536 } 3537 sprintf(s,GetPString(IDS_STATUSSIZETEXT), 3538 tb, 3539 *tf ? " (" : NullStr, 3540 tf, 3541 *tf ? ")" : NullStr); 3542 } 3543 WinSetWindowText(hwndStatus2,s); 3544 } 3545 if (fMoreButtons) { 3546 WinSetWindowText(hwndName,pci->pszFileName); 3547 sprintf(s,"%04u/%02u/%02u %02u:%02u:%02u", 3548 pci->date.year,pci->date.month, 3549 pci->date.day,pci->time.hours,pci->time.minutes, 3550 pci->time.seconds); 3551 WinSetWindowText(hwndDate,s); 3552 WinSetWindowText(hwndAttr,pci->pszDispAttr); 3553 } 3554 } 3555 } 3556 } 3557 } 3558 break; 3559 3560 case CN_ENTER: 3561 if (mp2) { 3562 3563 PCNRITEM pci = (PCNRITEM)((PNOTIFYRECORDENTER)mp2)->pRecord; 3564 FILEFINDBUF3 ffb; 3565 HDIR hDir = HDIR_CREATE; 3566 ULONG nm = 1L; 3567 APIRET status = 0; 3568 3569 SetShiftState(); 3570 if (pci) { 3571 if (pci->rc.flRecordAttr & CRA_INUSE) 3572 break; 3573 DosError(FERR_DISABLEHARDERR); 3574 status = DosFindFirst(pci->szFileName, 3575 &hDir, 3576 FILE_NORMAL | FILE_DIRECTORY | 3577 FILE_ARCHIVED | FILE_READONLY | 3578 FILE_HIDDEN | FILE_SYSTEM, 3579 &ffb, 3580 sizeof(ffb), 3581 &nm, 3582 FIL_STANDARD); 3583 priority_bumped(); 3584 if (!status) { 3585 DosFindClose(hDir); 3586 if (ffb.attrFile & FILE_DIRECTORY) { 3587 if ((shiftstate & (KC_CTRL | KC_ALT)) == 3588 (KC_CTRL | KC_ALT)) 3589 PostMsg(hwnd, 3590 WM_COMMAND, 3591 MPFROM2SHORT(IDM_SHOWALLFILES,0), 3592 MPVOID); 3593 else if ((shiftstate & (KC_CTRL | KC_SHIFT)) == 3594 (KC_CTRL | KC_SHIFT)) 3595 OpenObject(pci->szFileName, 3596 Settings, 3597 dcd->hwndFrame); 3598 else if (shiftstate & KC_CTRL) 3599 OpenObject(pci->szFileName, 3600 Default, 3601 dcd->hwndFrame); 3602 else if (shiftstate & KC_SHIFT) { 3603 3604 HWND hwndDir; 3605 3606 hwndDir = OpenDirCnr((HWND)0, 3607 dcd->hwndParent, 3608 dcd->hwndFrame, 3609 FALSE, 3610 pci->szFileName); 3611 if (hwndDir) { 3612 if (fMinOnOpen) 3613 WinSetWindowPos(dcd->hwndFrame, 3614 HWND_BOTTOM, 3615 0, 3616 0, 3617 0, 3618 0, 3619 SWP_MINIMIZE | SWP_ZORDER); 3620 if (fAutoTile) 3621 TileChildren(dcd->hwndParent, 3622 TRUE); 3623 WinSetWindowPos(hwndDir, 3624 HWND_TOP, 3625 0, 3626 0, 3627 0, 3628 0, 3629 SWP_ACTIVATE); 3630 } 3631 } 3632 else { 3633 strcpy(dcd->previous,dcd->directory); 3634 strcpy(dcd->directory,pci->szFileName); 3635 DosEnterCritSec(); 3636 dcd->stopflag++; 3637 DosExitCritSec(); 3638 if (!PostMsg(dcd->hwndObject, 3639 UM_RESCAN, 3640 MPVOID, 3641 MPFROMLONG(1L))) 3642 { 3643 DosEnterCritSec(); 3644 dcd->stopflag--; 3645 DosExitCritSec(); 3646 } 3647 else if (*dcd->directory) { 3648 if (hwndMain) 3649 WinSendMsg(hwndMain, 3650 UM_SETUSERLISTNAME, 3651 MPFROMP(dcd->directory), 3652 MPVOID); 3653 else 3654 add_udir(FALSE, 3655 dcd->directory); 3656 } 3657 } 3658 } 3659 else { 3660 3661 SWP swp; 3662 3663 WinQueryWindowPos(dcd->hwndFrame,&swp); 3664 WinSendMsg(hwnd, 3665 CM_SETRECORDEMPHASIS, 3666 MPFROMP(pci), 3667 MPFROM2SHORT(TRUE,CRA_INUSE)); 3668 DefaultViewKeys(hwnd, 3669 dcd->hwndFrame, 3670 dcd->hwndParent, 3671 &swp, 3672 pci->szFileName); 3673 WinSendMsg(hwnd, 3674 CM_SETRECORDEMPHASIS, 3675 MPFROMP(pci), 3676 MPFROM2SHORT(FALSE, 3677 CRA_INUSE | 3678 ((fUnHilite) ? 3679 CRA_SELECTED : 3680 0))); 3681 } 3682 } 3683 else { 3684 if (!*dcd->directory || IsValidDir(dcd->directory)) { 3685 NotifyError(pci->szFileName, 3686 status); 3687 WinSendMsg(hwnd, 3688 CM_REMOVERECORD, 3689 MPFROMP(&pci), 3690 MPFROM2SHORT(1, 3691 CMA_FREE | CMA_INVALIDATE | 3692 CMA_ERASE)); 3693 if (hwndStatus) 3694 WinSetWindowText(hwndStatus, 3695 GetPString(IDS_RESCANSUGGESTEDTEXT)); 3696 } 3697 else { 3698 DosEnterCritSec(); 3699 dcd->stopflag++; 3700 DosExitCritSec(); 3701 if (!PostMsg(dcd->hwndObject, 3702 UM_RESCAN, 3703 MPVOID, 3704 MPFROMLONG(1L))) 3705 { 3706 DosEnterCritSec(); 3707 dcd->stopflag--; 3708 DosExitCritSec(); 3709 } 3710 else if (*dcd->directory) { 3711 if (hwndMain) 3712 WinSendMsg(hwndMain, 3713 UM_SETUSERLISTNAME, 3714 MPFROMP(dcd->directory), 3715 MPVOID); 3716 else 3717 add_udir(FALSE, 3718 dcd->directory); 3719 } 3720 } 3721 } 3722 } 3723 else if (*dcd->directory) 3724 OpenObject(dcd->directory, 3725 Default, 3726 hwnd); 3727 } 3728 break; 3729 } 3730 break; 3731 } 3732 return 0; 3733 3734 case UM_LOADFILE: 3735 if (dcd && mp2) { 3736 3737 HWND ret; 3738 3739 ret = StartMLEEditor(dcd->hwndParent, 3740 (INT)mp1, 3741 (CHAR *)mp2, 3742 dcd->hwndFrame); 3743 if (mp2) 3744 free((CHAR *)mp2); 3745 return MRFROMLONG(ret); 3746 } 3747 return 0; 3748 3749 case WM_SAVEAPPLICATION: 3750 if (dcd && ParentIsDesktop(hwnd,dcd->hwndParent)) { 3751 3752 SWP swp; 3753 3754 WinQueryWindowPos(dcd->hwndFrame,&swp); 3755 if (!(swp.fl & (SWP_HIDE | SWP_MINIMIZE | SWP_MAXIMIZE))) 3756 PrfWriteProfileData(fmprof, 3757 appname, 3758 "VDirSizePos", 3759 &swp, 3760 sizeof(swp)); 3212 if (!*dcd->directory || IsValidDir(dcd->directory)) { 3213 NotifyError(pci->szFileName, status); 3214 WinSendMsg(hwnd, 3215 CM_REMOVERECORD, 3216 MPFROMP(&pci), 3217 MPFROM2SHORT(1, 3218 CMA_FREE | CMA_INVALIDATE | 3219 CMA_ERASE)); 3220 if (hwndStatus) 3221 WinSetWindowText(hwndStatus, 3222 GetPString(IDS_RESCANSUGGESTEDTEXT)); 3223 } 3224 else { 3225 DosEnterCritSec(); 3226 dcd->stopflag++; 3227 DosExitCritSec(); 3228 if (!PostMsg(dcd->hwndObject, 3229 UM_RESCAN, MPVOID, MPFROMLONG(1L))) { 3230 DosEnterCritSec(); 3231 dcd->stopflag--; 3232 DosExitCritSec(); 3233 } 3234 else if (*dcd->directory) { 3235 if (hwndMain) 3236 WinSendMsg(hwndMain, 3237 UM_SETUSERLISTNAME, 3238 MPFROMP(dcd->directory), MPVOID); 3239 else 3240 add_udir(FALSE, dcd->directory); 3241 } 3242 } 3243 } 3244 } 3245 else if (*dcd->directory) 3246 OpenObject(dcd->directory, Default, hwnd); 3247 } 3248 break; 3761 3249 } 3762 3250 break; 3763 3764 case WM_CLOSE: 3765 WinSendMsg(hwnd, 3766 WM_SAVEAPPLICATION, 3767 MPVOID, 3768 MPVOID); 3769 if (LastDir == hwnd) 3770 LastDir = (HWND)0; 3771 if (dcd) { 3772 dcd->stopflag++; 3773 if (!dcd->dontclose && ParentIsDesktop(dcd->hwndFrame,(HWND)0)) 3774 PostMsg((HWND)0, 3775 WM_QUIT, 3776 MPVOID, 3777 MPVOID); 3778 if (!dcd->hwndObject || 3779 !PostMsg(dcd->hwndObject, WM_CLOSE, MPVOID, MPVOID)) 3780 { 3781 if (dcd->hwndObject) 3782 WinSetWindowPtr(dcd->hwndObject, 3783 QWL_USER, 3784 NULL); 3785 WinSetWindowPtr(hwnd, 3786 QWL_USER, 3787 NULL); 3788 if (dcd->hwndRestore) 3789 WinSetWindowPos(dcd->hwndRestore, 3790 HWND_TOP, 3791 0, 3792 0, 3793 0, 3794 0, 3795 SWP_RESTORE | SWP_SHOW | SWP_ACTIVATE | 3796 SWP_ZORDER); 3797 FreeList(dcd->lastselection); 3798 free(dcd); 3799 DosPostEventSem(CompactSem); 3800 } 3801 } 3802 WinDestroyWindow(WinQueryWindow(WinQueryWindow(hwnd,QW_PARENT), 3803 QW_PARENT)); 3804 return 0; 3805 3806 case WM_DESTROY: 3807 if (DirMenu) 3808 WinDestroyWindow(DirMenu); 3809 if (DirCnrMenu) 3810 WinDestroyWindow(DirCnrMenu); 3811 if (FileMenu) 3812 WinDestroyWindow(FileMenu); 3813 DirMenu = DirCnrMenu = FileMenu = (HWND)0; 3814 EmptyCnr(hwnd); 3815 break; 3251 } 3252 return 0; 3253 3254 case UM_LOADFILE: 3255 if (dcd && mp2) { 3256 3257 HWND ret; 3258 3259 ret = StartMLEEditor(dcd->hwndParent, 3260 (INT) mp1, (CHAR *) mp2, dcd->hwndFrame); 3261 if (mp2) 3262 free((CHAR *) mp2); 3263 return MRFROMLONG(ret); 3264 } 3265 return 0; 3266 3267 case WM_SAVEAPPLICATION: 3268 if (dcd && ParentIsDesktop(hwnd, dcd->hwndParent)) { 3269 3270 SWP swp; 3271 3272 WinQueryWindowPos(dcd->hwndFrame, &swp); 3273 if (!(swp.fl & (SWP_HIDE | SWP_MINIMIZE | SWP_MAXIMIZE))) 3274 PrfWriteProfileData(fmprof, 3275 appname, "VDirSizePos", &swp, sizeof(swp)); 3276 } 3277 break; 3278 3279 case WM_CLOSE: 3280 WinSendMsg(hwnd, WM_SAVEAPPLICATION, MPVOID, MPVOID); 3281 if (LastDir == hwnd) 3282 LastDir = (HWND) 0; 3283 if (dcd) { 3284 dcd->stopflag++; 3285 if (!dcd->dontclose && ParentIsDesktop(dcd->hwndFrame, (HWND) 0)) 3286 PostMsg((HWND) 0, WM_QUIT, MPVOID, MPVOID); 3287 if (!dcd->hwndObject || 3288 !PostMsg(dcd->hwndObject, WM_CLOSE, MPVOID, MPVOID)) { 3289 if (dcd->hwndObject) 3290 WinSetWindowPtr(dcd->hwndObject, QWL_USER, NULL); 3291 WinSetWindowPtr(hwnd, QWL_USER, NULL); 3292 if (dcd->hwndRestore) 3293 WinSetWindowPos(dcd->hwndRestore, 3294 HWND_TOP, 3295 0, 3296 0, 3297 0, 3298 0, 3299 SWP_RESTORE | SWP_SHOW | SWP_ACTIVATE | SWP_ZORDER); 3300 FreeList(dcd->lastselection); 3301 free(dcd); 3302 DosPostEventSem(CompactSem); 3303 } 3304 } 3305 WinDestroyWindow(WinQueryWindow(WinQueryWindow(hwnd, QW_PARENT), 3306 QW_PARENT)); 3307 return 0; 3308 3309 case WM_DESTROY: 3310 if (DirMenu) 3311 WinDestroyWindow(DirMenu); 3312 if (DirCnrMenu) 3313 WinDestroyWindow(DirCnrMenu); 3314 if (FileMenu) 3315 WinDestroyWindow(FileMenu); 3316 DirMenu = DirCnrMenu = FileMenu = (HWND) 0; 3317 EmptyCnr(hwnd); 3318 break; 3816 3319 } 3817 return (dcd && dcd->oldproc) ? dcd->oldproc(hwnd, msg,mp1,mp2) :3818 PFNWPCnr(hwnd,msg,mp1,mp2);3320 return (dcd && dcd->oldproc) ? dcd->oldproc(hwnd, msg, mp1, mp2) : 3321 PFNWPCnr(hwnd, msg, mp1, mp2); 3819 3322 } 3820 3323 3821 3822 HWND StartDirCnr (HWND hwndParent,CHAR *directory,HWND hwndRestore,ULONG flags)3324 HWND StartDirCnr(HWND hwndParent, CHAR * directory, HWND hwndRestore, 3325 ULONG flags) 3823 3326 { 3824 3327 /* bitmapped flags: … … 3827 3330 */ 3828 3331 3829 HWND hwndFrame = (HWND)0,hwndClient; 3830 ULONG FrameFlags = FCF_TITLEBAR | FCF_SYSMENU | 3831 FCF_SIZEBORDER | FCF_MINMAX | 3832 FCF_ICON | FCF_NOBYTEALIGN | 3833 FCF_ACCELTABLE; 3834 USHORT id; 3332 HWND hwndFrame = (HWND) 0, hwndClient; 3333 ULONG FrameFlags = FCF_TITLEBAR | FCF_SYSMENU | 3334 FCF_SIZEBORDER | FCF_MINMAX | FCF_ICON | FCF_NOBYTEALIGN | FCF_ACCELTABLE; 3335 USHORT id; 3835 3336 static USHORT idinc = 0; 3836 DIRCNRDATA *dcd;3837 static BOOL first = FALSE;3838 3839 if (flags & 2)3337 DIRCNRDATA *dcd; 3338 static BOOL first = FALSE; 3339 3340 if (flags & 2) 3840 3341 FrameFlags &= (~(FCF_TITLEBAR | FCF_SYSMENU | FCF_SIZEBORDER | 3841 FCF_MINMAX| FCF_ICON));3842 if (!idinc)3342 FCF_MINMAX | FCF_ICON)); 3343 if (!idinc) 3843 3344 idinc = (rand() % 100); 3844 if (!hwndParent)3345 if (!hwndParent) 3845 3346 hwndParent = HWND_DESKTOP; 3846 if (ParentIsDesktop(hwndParent,hwndParent))3347 if (ParentIsDesktop(hwndParent, hwndParent)) 3847 3348 FrameFlags |= (FCF_TASKLIST | FCF_MENU); 3848 if (!hwndMain && !first) {3849 if (DirCnrMenu) {3349 if (!hwndMain && !first) { 3350 if (DirCnrMenu) { 3850 3351 3851 3352 MENUITEM mi; 3852 3353 3853 memset(&mi, 0,sizeof(mi));3354 memset(&mi, 0, sizeof(mi)); 3854 3355 WinSendMsg(DirCnrMenu, 3855 MM_DELETEITEM, 3856 MPFROM2SHORT(IDM_DRIVESMENU,FALSE), 3857 MPVOID); 3356 MM_DELETEITEM, MPFROM2SHORT(IDM_DRIVESMENU, FALSE), MPVOID); 3858 3357 mi.iPosition = MIT_END; 3859 3358 mi.afStyle = MIS_TEXT; 3860 3359 mi.id = IDM_DRIVESMENU; 3861 3360 WinSendMsg(DirCnrMenu, 3862 MM_INSERTITEM, 3863 MPFROMP(&mi), 3864 MPFROMP(GetPString(IDS_DRIVESMENUTEXT))); 3361 MM_INSERTITEM, 3362 MPFROMP(&mi), MPFROMP(GetPString(IDS_DRIVESMENUTEXT))); 3865 3363 } 3866 3364 first = TRUE; 3867 3365 } 3868 if (directory) {3366 if (directory) { 3869 3367 hwndFrame = WinCreateStdWindow(hwndParent, 3870 WS_VISIBLE, 3871 &FrameFlags, 3872 GetPString(IDS_WCDIRCONTAINER), 3873 NULL, 3874 WS_VISIBLE | fwsAnimate, 3875 FM3ModHandle, 3876 DIR_FRAME, 3877 &hwndClient); 3878 if(hwndFrame && hwndClient) { 3368 WS_VISIBLE, 3369 &FrameFlags, 3370 GetPString(IDS_WCDIRCONTAINER), 3371 NULL, 3372 WS_VISIBLE | fwsAnimate, 3373 FM3ModHandle, DIR_FRAME, &hwndClient); 3374 if (hwndFrame && hwndClient) { 3879 3375 id = DIR_FRAME + idinc++; 3880 if (idinc > 99)3881 idinc = 0;3882 WinSetWindowUShort(hwndFrame, QWS_ID,id);3883 dcd = xmallocz(sizeof(DIRCNRDATA), pszSrcFile,__LINE__);3376 if (idinc > 99) 3377 idinc = 0; 3378 WinSetWindowUShort(hwndFrame, QWS_ID, id); 3379 dcd = xmallocz(sizeof(DIRCNRDATA), pszSrcFile, __LINE__); 3884 3380 if (!dcd) { 3885 PostMsg(hwndClient,WM_CLOSE,MPVOID,MPVOID);3886 hwndFrame = (HWND)0;3381 PostMsg(hwndClient, WM_CLOSE, MPVOID, MPVOID); 3382 hwndFrame = (HWND) 0; 3887 3383 } 3888 3384 else { 3889 dcd->size = sizeof(DIRCNRDATA); 3890 dcd->id = id; 3891 dcd->type = DIR_FRAME; 3892 dcd->hwndParent = (hwndParent) ? hwndParent : HWND_DESKTOP; 3893 dcd->hwndFrame = hwndFrame; 3894 dcd->hwndClient = hwndClient; 3895 dcd->hwndRestore = hwndRestore; 3896 dcd->dontclose = ((flags & 1) != 0); 3897 strcpy(dcd->directory,directory); 3898 add_udir(FALSE,directory); 3899 { 3900 PFNWP oldproc; 3901 3902 oldproc = WinSubclassWindow(hwndFrame, 3903 (PFNWP)DirFrameWndProc); 3904 WinSetWindowPtr(hwndFrame, 3905 QWL_USER, 3906 (PVOID)oldproc); 3907 } 3908 dcd->hwndCnr = WinCreateWindow(hwndClient, 3909 WC_CONTAINER, 3910 NULL, 3911 CCS_AUTOPOSITION | CCS_MINIICONS | 3912 CCS_MINIRECORDCORE | ulCnrType | 3913 WS_VISIBLE, 3914 0, 3915 0, 3916 0, 3917 0, 3918 hwndClient, 3919 HWND_TOP, 3920 (ULONG)DIR_CNR, 3921 NULL, 3922 NULL); 3923 if (!dcd->hwndCnr) { 3924 Win_Error2(hwndClient,hwndClient,pszSrcFile,__LINE__,IDS_WINCREATEWINDOW); 3925 PostMsg(hwndClient,WM_CLOSE,MPVOID,MPVOID); 3926 free(dcd); 3927 hwndFrame = (HWND)0; 3385 dcd->size = sizeof(DIRCNRDATA); 3386 dcd->id = id; 3387 dcd->type = DIR_FRAME; 3388 dcd->hwndParent = (hwndParent) ? hwndParent : HWND_DESKTOP; 3389 dcd->hwndFrame = hwndFrame; 3390 dcd->hwndClient = hwndClient; 3391 dcd->hwndRestore = hwndRestore; 3392 dcd->dontclose = ((flags & 1) != 0); 3393 strcpy(dcd->directory, directory); 3394 add_udir(FALSE, directory); 3395 { 3396 PFNWP oldproc; 3397 3398 oldproc = WinSubclassWindow(hwndFrame, (PFNWP) DirFrameWndProc); 3399 WinSetWindowPtr(hwndFrame, QWL_USER, (PVOID) oldproc); 3400 } 3401 dcd->hwndCnr = WinCreateWindow(hwndClient, 3402 WC_CONTAINER, 3403 NULL, 3404 CCS_AUTOPOSITION | CCS_MINIICONS | 3405 CCS_MINIRECORDCORE | ulCnrType | 3406 WS_VISIBLE, 3407 0, 3408 0, 3409 0, 3410 0, 3411 hwndClient, 3412 HWND_TOP, (ULONG) DIR_CNR, NULL, NULL); 3413 if (!dcd->hwndCnr) { 3414 Win_Error2(hwndClient, hwndClient, pszSrcFile, __LINE__, 3415 IDS_WINCREATEWINDOW); 3416 PostMsg(hwndClient, WM_CLOSE, MPVOID, MPVOID); 3417 free(dcd); 3418 hwndFrame = (HWND) 0; 3928 3419 } 3929 3420 else { 3930 WinSetWindowPtr(dcd->hwndCnr,QWL_USER,(PVOID)dcd); 3931 dcd->oldproc = WinSubclassWindow(dcd->hwndCnr, 3932 (PFNWP)DirCnrWndProc); 3933 { 3934 USHORT ids[] = {DIR_TOTALS,DIR_SELECTED,DIR_VIEW,DIR_SORT, 3935 DIR_FILTER,DIR_FOLDERICON,DIR_MAX,0}; 3936 3937 if(!(flags & 2)) 3938 ids[6] = 0; 3939 CommonCreateTextChildren(dcd->hwndClient, 3940 GetPString(IDS_WCDIRSTATUS), 3941 ids); 3942 } 3943 if(!PostMsg(dcd->hwndCnr, 3944 UM_SETUP, 3945 MPVOID, 3946 MPVOID)) 3947 WinSendMsg(dcd->hwndCnr, 3948 UM_SETUP, 3949 MPVOID, 3950 MPVOID); 3951 if(FrameFlags & FCF_TASKLIST) { 3952 3953 SWP swp,swpD; 3954 ULONG size = sizeof(swp); 3955 LONG cxScreen,cyScreen; 3956 3957 WinQueryTaskSizePos(WinQueryAnchorBlock(hwndFrame),0,&swp); 3958 if(PrfQueryProfileData(fmprof, 3959 appname, 3960 "VDirSizePos", 3961 &swpD, 3962 &size)) { 3963 cxScreen = WinQuerySysValue(HWND_DESKTOP,SV_CXSCREEN); 3964 cyScreen = WinQuerySysValue(HWND_DESKTOP,SV_CYSCREEN); 3965 if(swp.x + swpD.cx > cxScreen) 3966 swp.x = cxScreen - swpD.cx; 3967 if(swp.y + swpD.cy > cyScreen) 3968 swp.y = cyScreen - swpD.cy; 3969 swp.cx = swpD.cx; 3970 swp.cy = swpD.cy; 3971 } 3972 WinSetWindowPos(hwndFrame, 3973 HWND_TOP, 3974 swp.x, 3975 swp.y, 3976 swp.cx, 3977 swp.cy, 3978 SWP_SIZE | SWP_MOVE | SWP_SHOW | SWP_ZORDER | 3979 SWP_ACTIVATE); 3980 } 3981 } 3421 WinSetWindowPtr(dcd->hwndCnr, QWL_USER, (PVOID) dcd); 3422 dcd->oldproc = WinSubclassWindow(dcd->hwndCnr, 3423 (PFNWP) DirCnrWndProc); 3424 { 3425 USHORT ids[] = { DIR_TOTALS, DIR_SELECTED, DIR_VIEW, DIR_SORT, 3426 DIR_FILTER, DIR_FOLDERICON, DIR_MAX, 0 3427 }; 3428 3429 if (!(flags & 2)) 3430 ids[6] = 0; 3431 CommonCreateTextChildren(dcd->hwndClient, 3432 GetPString(IDS_WCDIRSTATUS), ids); 3433 } 3434 if (!PostMsg(dcd->hwndCnr, UM_SETUP, MPVOID, MPVOID)) 3435 WinSendMsg(dcd->hwndCnr, UM_SETUP, MPVOID, MPVOID); 3436 if (FrameFlags & FCF_TASKLIST) { 3437 3438 SWP swp, swpD; 3439 ULONG size = sizeof(swp); 3440 LONG cxScreen, cyScreen; 3441 3442 WinQueryTaskSizePos(WinQueryAnchorBlock(hwndFrame), 0, &swp); 3443 if (PrfQueryProfileData(fmprof, 3444 appname, "VDirSizePos", &swpD, &size)) { 3445 cxScreen = WinQuerySysValue(HWND_DESKTOP, SV_CXSCREEN); 3446 cyScreen = WinQuerySysValue(HWND_DESKTOP, SV_CYSCREEN); 3447 if (swp.x + swpD.cx > cxScreen) 3448 swp.x = cxScreen - swpD.cx; 3449 if (swp.y + swpD.cy > cyScreen) 3450 swp.y = cyScreen - swpD.cy; 3451 swp.cx = swpD.cx; 3452 swp.cy = swpD.cy; 3453 } 3454 WinSetWindowPos(hwndFrame, 3455 HWND_TOP, 3456 swp.x, 3457 swp.y, 3458 swp.cx, 3459 swp.cy, 3460 SWP_SIZE | SWP_MOVE | SWP_SHOW | SWP_ZORDER | 3461 SWP_ACTIVATE); 3462 } 3463 } 3982 3464 } 3983 3465 } … … 3985 3467 return hwndFrame; 3986 3468 } 3987
Note:
See TracChangeset
for help on using the changeset viewer.
