Changeset 551 for trunk/dll/draglist.c
- Timestamp:
- Feb 28, 2007, 2:33:51 AM (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/dll/draglist.c
r364 r551 29 29 #pragma alloc_text(DRAGLIST,DragOne,DoFileDrag,DragList,PickUp) 30 30 31 HWND DragOne (HWND hwndCnr,HWND hwndObj,CHAR *filename,BOOL moveok) { 32 33 DRAGITEM DItem; 34 HWND hDrop = 0; 35 DRAGIMAGE fakeicon; 36 PDRAGINFO pDInfo; 31 HWND DragOne(HWND hwndCnr, HWND hwndObj, CHAR * filename, BOOL moveok) 32 { 33 34 DRAGITEM DItem; 35 HWND hDrop = 0; 36 DRAGIMAGE fakeicon; 37 PDRAGINFO pDInfo; 37 38 FILESTATUS3 fs3; 38 CHAR szDir[CCHMAXPATH],szFile[CCHMAXPATH],*p;39 40 if (filename && *filename) {41 if ((IsRoot(filename) && IsValidDrive(*filename)) ||42 !DosQueryPathInfo(filename,FIL_STANDARD,&fs3,sizeof(fs3))) {43 strcpy(szDir, filename);39 CHAR szDir[CCHMAXPATH], szFile[CCHMAXPATH], *p; 40 41 if (filename && *filename) { 42 if ((IsRoot(filename) && IsValidDrive(*filename)) || 43 !DosQueryPathInfo(filename, FIL_STANDARD, &fs3, sizeof(fs3))) { 44 strcpy(szDir, filename); 44 45 p = szDir; 45 while (*p) {46 if(*p == '/')47 48 49 } 50 p = strrchr(szDir, '\\');51 if (p) {52 53 54 strcpy(szFile,p);55 strcat(szDir,"\\");46 while (*p) { 47 if (*p == '/') 48 *p = '\\'; 49 p++; 50 } 51 p = strrchr(szDir, '\\'); 52 if (p) { 53 *p = 0; 54 p++; 55 strcpy(szFile, p); 56 strcat(szDir, "\\"); 56 57 } 57 58 else { 58 strcpy(szFile,filename);59 60 } 61 memset(&fakeicon, 0,sizeof(DRAGIMAGE));59 strcpy(szFile, filename); 60 *szDir = 0; 61 } 62 memset(&fakeicon, 0, sizeof(DRAGIMAGE)); 62 63 fakeicon.hImage = (IsRoot(filename) || 63 64 65 memset(&DItem, 0,sizeof(DRAGITEM));66 DItem.hwndItem = (hwndObj) ? hwndObj : hwndCnr; 64 (fs3.attrFile & FILE_DIRECTORY) != 0) ? 65 hptrDir : hptrFile; 66 memset(&DItem, 0, sizeof(DRAGITEM)); 67 DItem.hwndItem = (hwndObj) ? hwndObj : hwndCnr; /* Initialize DRAGITEM */ 67 68 // DItem.hwndItem = hwndCnr; 68 69 DItem.ulItemID = 1; 69 70 DItem.hstrType = DrgAddStrHandle(DRT_UNKNOWN); 70 DItem.hstrRMF = 71 DrgAddStrHandle(DRMDRFLIST); 71 DItem.hstrRMF = DrgAddStrHandle(DRMDRFLIST); 72 72 DItem.hstrContainerName = DrgAddStrHandle(szDir); 73 73 DItem.hstrSourceName = DrgAddStrHandle(szFile); 74 74 DItem.hstrTargetName = DrgAddStrHandle(szFile); 75 75 DItem.fsControl = 0; 76 if (IsRoot(filename) || (fs3.attrFile & FILE_DIRECTORY) != 0)77 78 if (IsFullName(filename) &&79 80 76 if (IsRoot(filename) || (fs3.attrFile & FILE_DIRECTORY) != 0) 77 DItem.fsControl |= DC_CONTAINER; 78 if (IsFullName(filename) && 79 (driveflags[toupper(*filename) - 'A'] & DRIVE_REMOVABLE)) 80 DItem.fsControl |= DC_REMOVEABLEMEDIA; 81 81 DItem.fsSupportedOps = DO_COPYABLE | DO_LINKABLE; 82 if (moveok && IsFullName(filename) &&83 84 85 if (IsRoot(filename))86 82 if (moveok && IsFullName(filename) && 83 !(driveflags[toupper(*filename) - 'A'] & DRIVE_NOTWRITEABLE)) 84 DItem.fsSupportedOps |= DO_MOVEABLE; 85 if (IsRoot(filename)) 86 DItem.fsSupportedOps = DO_LINKABLE; 87 87 fakeicon.cb = sizeof(DRAGIMAGE); 88 88 fakeicon.cptl = 0; … … 92 92 fakeicon.cxOffset = -16; 93 93 fakeicon.cyOffset = 0; 94 pDInfo = DrgAllocDraginfo(1); /* Allocate DRAGINFO */ 95 if(pDInfo) { 96 if(IsFullName(filename) && 97 (driveflags[toupper(*filename) - 'A'] & DRIVE_NOTWRITEABLE)) 98 pDInfo->usOperation = DO_COPY; 99 else 100 pDInfo->usOperation = DO_DEFAULT; 101 if(IsRoot(filename)) 102 pDInfo->usOperation = DO_LINK; 103 pDInfo->hwndSource = (hwndObj) ? hwndObj : hwndCnr; 104 // pDInfo->hwndSource = hwndCnr; 105 DrgSetDragitem(pDInfo, /* Set item in DRAGINFO */ 106 &DItem, /* Pointer to DRAGITEM */ 107 sizeof(DRAGITEM), /* Size of DRAGITEM */ 108 0); /* Index of DRAGITEM */ 109 WinSetFocus(HWND_DESKTOP,HWND_DESKTOP); 110 hDrop = DrgDrag(hwndCnr, /* Initiate drag */ 111 pDInfo, /* DRAGINFO structure */ 112 &fakeicon, 113 1L, 114 VK_ENDDRAG, /* End of drag indicator */ 115 (PVOID)NULL); /* Reserved */ 116 117 DrgFreeDraginfo(pDInfo); /* Free DRAGINFO struct */ 118 WinSetWindowPos(hwndCnr,HWND_TOP,0,0,0,0,SWP_ACTIVATE); 94 pDInfo = DrgAllocDraginfo(1); /* Allocate DRAGINFO */ 95 if (pDInfo) { 96 if (IsFullName(filename) && 97 (driveflags[toupper(*filename) - 'A'] & DRIVE_NOTWRITEABLE)) 98 pDInfo->usOperation = DO_COPY; 99 else 100 pDInfo->usOperation = DO_DEFAULT; 101 if (IsRoot(filename)) 102 pDInfo->usOperation = DO_LINK; 103 pDInfo->hwndSource = (hwndObj) ? hwndObj : hwndCnr; 104 // pDInfo->hwndSource = hwndCnr; 105 DrgSetDragitem(pDInfo, /* Set item in DRAGINFO */ 106 &DItem, /* Pointer to DRAGITEM */ 107 sizeof(DRAGITEM), /* Size of DRAGITEM */ 108 0); /* Index of DRAGITEM */ 109 WinSetFocus(HWND_DESKTOP, HWND_DESKTOP); 110 hDrop = DrgDrag(hwndCnr, /* Initiate drag */ 111 pDInfo, /* DRAGINFO structure */ 112 &fakeicon, 1L, VK_ENDDRAG, /* End of drag indicator */ 113 (PVOID) NULL); /* Reserved */ 114 115 DrgFreeDraginfo(pDInfo); /* Free DRAGINFO struct */ 116 WinSetWindowPos(hwndCnr, HWND_TOP, 0, 0, 0, 0, SWP_ACTIVATE); 119 117 } 120 118 } … … 123 121 } 124 122 125 126 HWND DoFileDrag (HWND hwndCnr,HWND hwndObj,PCNRDRAGINIT pcd,CHAR *arcfile, 127 CHAR *directory,BOOL moveok) 123 HWND DoFileDrag(HWND hwndCnr, HWND hwndObj, PCNRDRAGINIT pcd, CHAR * arcfile, 124 CHAR * directory, BOOL moveok) 128 125 { 129 126 /* drag files from a container */ 130 127 131 BOOL isdir,rooting = FALSE; 132 PCNRITEM pci; 133 register CHAR *p; 134 INT attribute = CRA_CURSORED; 135 PDRAGINFO pDInfo = NULL; 136 DRAGITEM **ppDItem = NULL,**ppTest; 137 PCNRITEM pciRec = (PCNRITEM)pcd->pRecord; 138 HWND hDrop = 0; 139 register ULONG ulNumfiles = 0L,numdragalloc = 0L,Select,ulNumIcon = 0; 140 CHAR szFile[CCHMAXPATH],szBuffer[CCHMAXPATH]; 141 DRAGIMAGE *padiIcon = NULL,*padiTest,diFakeIcon; 142 143 if(!pciRec && directory && *directory) 144 return DragOne(hwndCnr,hwndObj,directory,moveok); 145 146 if(!pciRec) { 147 pci = (PCNRITEM)WinSendMsg(hwndCnr,CM_QUERYRECORDEMPHASIS, 148 MPFROMLONG(CMA_FIRST), 149 MPFROMSHORT(attribute)); 150 if(pci && (INT)pci > -1) { 151 if(pci->rc.flRecordAttr & CRA_SELECTED) { 152 attribute = CRA_SELECTED; 153 pci = WinSendMsg(hwndCnr,CM_QUERYRECORDEMPHASIS,MPFROMLONG(CMA_FIRST), 154 MPFROMSHORT(attribute)); 128 BOOL isdir, rooting = FALSE; 129 PCNRITEM pci; 130 register CHAR *p; 131 INT attribute = CRA_CURSORED; 132 PDRAGINFO pDInfo = NULL; 133 DRAGITEM **ppDItem = NULL, **ppTest; 134 PCNRITEM pciRec = (PCNRITEM) pcd->pRecord; 135 HWND hDrop = 0; 136 register ULONG ulNumfiles = 0L, numdragalloc = 0L, Select, ulNumIcon = 0; 137 CHAR szFile[CCHMAXPATH], szBuffer[CCHMAXPATH]; 138 DRAGIMAGE *padiIcon = NULL, *padiTest, diFakeIcon; 139 140 if (!pciRec && directory && *directory) 141 return DragOne(hwndCnr, hwndObj, directory, moveok); 142 143 if (!pciRec) { 144 pci = (PCNRITEM) WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS, 145 MPFROMLONG(CMA_FIRST), 146 MPFROMSHORT(attribute)); 147 if (pci && (INT) pci > -1) { 148 if (pci->rc.flRecordAttr & CRA_SELECTED) { 149 attribute = CRA_SELECTED; 150 pci = 151 WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS, MPFROMLONG(CMA_FIRST), 152 MPFROMSHORT(attribute)); 155 153 } 156 154 } … … 159 157 pci = pciRec; 160 158 attribute = (pci->rc.flRecordAttr & CRA_SELECTED) ? CRA_SELECTED : 0; 161 if (attribute) {162 pci = WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS,MPFROMLONG(CMA_FIRST),163 159 if (attribute) { 160 pci = WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS, MPFROMLONG(CMA_FIRST), 161 MPFROMSHORT(attribute)); 164 162 } 165 163 } 166 164 167 165 Select = 0L; 168 while ( pci && (INT)pci > -1) {169 if (!(pci->rc.flRecordAttr & CRA_FILTERED)) {170 if (IsRoot(pci->szFileName) && !IsValidDrive(*pci->szFileName))171 172 if (!arcfile) {173 strcpy(szBuffer,pci->szFileName);174 p = strrchr(szBuffer,'\\');175 if(p) {176 177 strcpy(szFile,p);178 179 180 181 166 while (pci && (INT) pci > -1) { 167 if (!(pci->rc.flRecordAttr & CRA_FILTERED)) { 168 if (IsRoot(pci->szFileName) && !IsValidDrive(*pci->szFileName)) 169 goto Continuing; 170 if (!arcfile) { 171 strcpy(szBuffer, pci->szFileName); 172 p = strrchr(szBuffer, '\\'); 173 if (p) { 174 p++; 175 strcpy(szFile, p); 176 *p = 0; 177 } 178 else 179 goto Continuing; 182 180 } 183 181 else 184 strcpy(szFile,pci->szFileName);185 } 186 if (!arcfile) {182 strcpy(szFile, pci->szFileName); 183 } 184 if (!arcfile) { 187 185 // Filesystem object 188 186 isdir = ((pci->attrFile & FILE_DIRECTORY) != 0); 189 if(ulNumfiles + 2L > numdragalloc) { 190 if (!padiIcon) { 191 padiTest = xrealloc(padiIcon,sizeof(DRAGIMAGE) * (numdragalloc + 4L), pszSrcFile, __LINE__); 192 if(padiTest) 193 padiIcon = padiTest; 194 else 195 break; 196 } 197 else if(!ulNumIcon) { 198 padiIcon[ulNumfiles].cb = sizeof(DRAGIMAGE); 199 padiIcon[ulNumfiles].cptl = 0; 200 padiIcon[ulNumfiles].hImage = hptrLast; 201 padiIcon[ulNumfiles].fl = DRG_ICON; 202 padiIcon[ulNumfiles].sizlStretch.cx = 32; 203 padiIcon[ulNumfiles].sizlStretch.cy = 32; 204 padiIcon[ulNumfiles].cxOffset = -16 + (ulNumfiles * 4); 205 padiIcon[ulNumfiles].cyOffset = 0 + (ulNumfiles * 7); 206 ulNumIcon = ulNumfiles + 1; 207 } 208 ppTest = xrealloc(ppDItem,sizeof(DRAGITEM *) * (numdragalloc + 4L), pszSrcFile, __LINE__); 209 if (ppTest) { 210 ppDItem = ppTest; 211 numdragalloc += 4L; 212 } 213 else 214 break; 187 if (ulNumfiles + 2L > numdragalloc) { 188 if (!padiIcon) { 189 padiTest = 190 xrealloc(padiIcon, sizeof(DRAGIMAGE) * (numdragalloc + 4L), 191 pszSrcFile, __LINE__); 192 if (padiTest) 193 padiIcon = padiTest; 194 else 195 break; 196 } 197 else if (!ulNumIcon) { 198 padiIcon[ulNumfiles].cb = sizeof(DRAGIMAGE); 199 padiIcon[ulNumfiles].cptl = 0; 200 padiIcon[ulNumfiles].hImage = hptrLast; 201 padiIcon[ulNumfiles].fl = DRG_ICON; 202 padiIcon[ulNumfiles].sizlStretch.cx = 32; 203 padiIcon[ulNumfiles].sizlStretch.cy = 32; 204 padiIcon[ulNumfiles].cxOffset = -16 + (ulNumfiles * 4); 205 padiIcon[ulNumfiles].cyOffset = 0 + (ulNumfiles * 7); 206 ulNumIcon = ulNumfiles + 1; 207 } 208 ppTest = 209 xrealloc(ppDItem, sizeof(DRAGITEM *) * (numdragalloc + 4L), 210 pszSrcFile, __LINE__); 211 if (ppTest) { 212 ppDItem = ppTest; 213 numdragalloc += 4L; 214 } 215 else 216 break; 215 217 } 216 218 ppDItem[ulNumfiles] = xmalloc(sizeof(DRAGITEM), pszSrcFile, __LINE__); 217 219 if (ppDItem[ulNumfiles]) { 218 if (!ulNumIcon) { 219 padiIcon[ulNumfiles].cb = sizeof(DRAGIMAGE); 220 padiIcon[ulNumfiles].cptl = 0; 221 padiIcon[ulNumfiles].hImage = pci->rc.hptrIcon; 222 if(!padiIcon[ulNumfiles].hImage) 223 padiIcon[ulNumfiles].hImage = (isdir) ? hptrDir : hptrFile; 224 padiIcon[ulNumfiles].fl = DRG_ICON; 225 padiIcon[ulNumfiles].sizlStretch.cx = 32; 226 padiIcon[ulNumfiles].sizlStretch.cy = 32; 227 padiIcon[ulNumfiles].cxOffset = -16 + (ulNumfiles * 3); 228 padiIcon[ulNumfiles].cyOffset = 0 + (ulNumfiles * 6); 229 } 230 memset(ppDItem[ulNumfiles],0,sizeof(DRAGITEM)); 231 ppDItem[ulNumfiles]->hwndItem = (hwndObj) ? hwndObj : hwndCnr; /* Initialize DRAGITEM */ 232 ppDItem[ulNumfiles]->hwndItem = hwndCnr; 233 ppDItem[ulNumfiles]->ulItemID = (ULONG)pci; 234 ppDItem[ulNumfiles]->hstrType = DrgAddStrHandle(DRT_UNKNOWN); 235 ppDItem[ulNumfiles]->hstrRMF = DrgAddStrHandle(DRMDRFLIST); 236 ppDItem[ulNumfiles]->hstrContainerName = DrgAddStrHandle(szBuffer); 237 ppDItem[ulNumfiles]->hstrSourceName = DrgAddStrHandle(szFile); 238 ppDItem[ulNumfiles]->hstrTargetName = DrgAddStrHandle(szFile); 239 ppDItem[ulNumfiles]->fsControl = (isdir) ? DC_CONTAINER : 0; 240 if(IsFullName(pci->szFileName) && 241 (driveflags[toupper(*pci->szFileName) - 'A'] & DRIVE_REMOVABLE)) 242 ppDItem[ulNumfiles]->fsControl |= DC_REMOVEABLEMEDIA; 243 ppDItem[ulNumfiles]->fsSupportedOps = DO_COPYABLE | DO_LINKABLE; 244 if(moveok && IsFullName(pci->szFileName) && 245 !(driveflags[toupper(*pci->szFileName) - 'A'] & DRIVE_NOTWRITEABLE)) 246 ppDItem[ulNumfiles]->fsSupportedOps |= DO_MOVEABLE; 247 if(IsRoot(pci->szFileName)) { 248 ppDItem[ulNumfiles]->fsSupportedOps = DO_LINKABLE; 249 rooting = TRUE; 250 } 251 ulNumfiles++; 252 ppDItem[ulNumfiles] = NULL; 220 if (!ulNumIcon) { 221 padiIcon[ulNumfiles].cb = sizeof(DRAGIMAGE); 222 padiIcon[ulNumfiles].cptl = 0; 223 padiIcon[ulNumfiles].hImage = pci->rc.hptrIcon; 224 if (!padiIcon[ulNumfiles].hImage) 225 padiIcon[ulNumfiles].hImage = (isdir) ? hptrDir : hptrFile; 226 padiIcon[ulNumfiles].fl = DRG_ICON; 227 padiIcon[ulNumfiles].sizlStretch.cx = 32; 228 padiIcon[ulNumfiles].sizlStretch.cy = 32; 229 padiIcon[ulNumfiles].cxOffset = -16 + (ulNumfiles * 3); 230 padiIcon[ulNumfiles].cyOffset = 0 + (ulNumfiles * 6); 231 } 232 memset(ppDItem[ulNumfiles], 0, sizeof(DRAGITEM)); 233 ppDItem[ulNumfiles]->hwndItem = (hwndObj) ? hwndObj : hwndCnr; /* Initialize DRAGITEM */ 234 ppDItem[ulNumfiles]->hwndItem = hwndCnr; 235 ppDItem[ulNumfiles]->ulItemID = (ULONG) pci; 236 ppDItem[ulNumfiles]->hstrType = DrgAddStrHandle(DRT_UNKNOWN); 237 ppDItem[ulNumfiles]->hstrRMF = DrgAddStrHandle(DRMDRFLIST); 238 ppDItem[ulNumfiles]->hstrContainerName = DrgAddStrHandle(szBuffer); 239 ppDItem[ulNumfiles]->hstrSourceName = DrgAddStrHandle(szFile); 240 ppDItem[ulNumfiles]->hstrTargetName = DrgAddStrHandle(szFile); 241 ppDItem[ulNumfiles]->fsControl = (isdir) ? DC_CONTAINER : 0; 242 if (IsFullName(pci->szFileName) && 243 (driveflags[toupper(*pci->szFileName) - 'A'] & DRIVE_REMOVABLE)) 244 ppDItem[ulNumfiles]->fsControl |= DC_REMOVEABLEMEDIA; 245 ppDItem[ulNumfiles]->fsSupportedOps = DO_COPYABLE | DO_LINKABLE; 246 if (moveok && IsFullName(pci->szFileName) && 247 !(driveflags[toupper(*pci->szFileName) - 'A'] & 248 DRIVE_NOTWRITEABLE)) 249 ppDItem[ulNumfiles]->fsSupportedOps |= DO_MOVEABLE; 250 if (IsRoot(pci->szFileName)) { 251 ppDItem[ulNumfiles]->fsSupportedOps = DO_LINKABLE; 252 rooting = TRUE; 253 } 254 ulNumfiles++; 255 ppDItem[ulNumfiles] = NULL; 253 256 } 254 257 else 255 258 break; 256 259 } 257 260 else { 258 261 // Archive object 259 if(ulNumfiles + 3L > numdragalloc) { 260 ppTest = xrealloc(ppDItem,sizeof(DRAGITEM *) * (numdragalloc + 5L), pszSrcFile, __LINE__); 261 if (!ppTest) 262 break; 262 if (ulNumfiles + 3L > numdragalloc) { 263 ppTest = 264 xrealloc(ppDItem, sizeof(DRAGITEM *) * (numdragalloc + 5L), 265 pszSrcFile, __LINE__); 266 if (!ppTest) 267 break; 263 268 else { 264 265 266 269 ppDItem = ppTest; 270 numdragalloc += 5L; 271 } 267 272 } 268 273 ppDItem[ulNumfiles] = xmalloc(sizeof(DRAGITEM), pszSrcFile, __LINE__); 269 274 if (!ppDItem[ulNumfiles]) 270 275 break; 271 276 else { 272 273 memset(ppDItem[ulNumfiles],0,sizeof(DRAGITEM));274 ppDItem[ulNumfiles]->hwndItem = (hwndObj) ? hwndObj : hwndCnr;/* Initialize DRAGITEM */275 276 ppDItem[ulNumfiles]->ulItemID = (ULONG)pci;277 278 279 280 281 282 283 if(IsFullName(arcfile) &&284 285 286 287 288 289 290 291 memset(ppDItem[ulNumfiles],0,sizeof(DRAGITEM));292 ppDItem[ulNumfiles]->hwndItem = (hwndObj) ? hwndObj : hwndCnr;/* Initialize DRAGITEM */293 294 295 296 297 298 299 300 301 if(IsFullName(arcfile) &&302 303 304 305 306 307 308 } 309 } 310 WinSendMsg(hwndCnr, CM_SETRECORDEMPHASIS,MPFROMP(pci),311 MPFROM2SHORT(TRUE,CRA_SOURCE));312 313 Continuing:314 315 if (!attribute)277 diFakeIcon.hImage = hptrFile; 278 memset(ppDItem[ulNumfiles], 0, sizeof(DRAGITEM)); 279 ppDItem[ulNumfiles]->hwndItem = (hwndObj) ? hwndObj : hwndCnr; /* Initialize DRAGITEM */ 280 ppDItem[ulNumfiles]->hwndItem = hwndCnr; 281 ppDItem[ulNumfiles]->ulItemID = (ULONG) pci; 282 ppDItem[ulNumfiles]->hstrType = DrgAddStrHandle(DRT_UNKNOWN); 283 ppDItem[ulNumfiles]->hstrRMF = DrgAddStrHandle(DRMDRFOS2FILE); 284 ppDItem[ulNumfiles]->hstrContainerName = DrgAddStrHandle(arcfile); 285 ppDItem[ulNumfiles]->hstrSourceName = DrgAddStrHandle(szFile); 286 ppDItem[ulNumfiles]->hstrTargetName = DrgAddStrHandle(szFile); 287 ppDItem[ulNumfiles]->fsControl = DC_PREPARE; 288 if (IsFullName(arcfile) && 289 (driveflags[toupper(*arcfile) - 'A'] & DRIVE_REMOVABLE)) 290 ppDItem[ulNumfiles]->fsControl |= DC_REMOVEABLEMEDIA; 291 ppDItem[ulNumfiles]->fsSupportedOps = DO_COPYABLE; 292 ulNumfiles++; 293 ppDItem[ulNumfiles] = xmalloc(sizeof(DRAGITEM), pszSrcFile, __LINE__); 294 if (ppDItem[ulNumfiles]) { 295 diFakeIcon.hImage = hptrFile; 296 memset(ppDItem[ulNumfiles], 0, sizeof(DRAGITEM)); 297 ppDItem[ulNumfiles]->hwndItem = (hwndObj) ? hwndObj : hwndCnr; /* Initialize DRAGITEM */ 298 ppDItem[ulNumfiles]->hwndItem = hwndCnr; 299 ppDItem[ulNumfiles]->ulItemID = Select++; 300 ppDItem[ulNumfiles]->hstrType = DrgAddStrHandle(DRT_UNKNOWN); 301 ppDItem[ulNumfiles]->hstrRMF = DrgAddStrHandle(DRMDRFFM2ARC); 302 ppDItem[ulNumfiles]->hstrContainerName = DrgAddStrHandle(arcfile); 303 ppDItem[ulNumfiles]->hstrSourceName = DrgAddStrHandle(szFile); 304 ppDItem[ulNumfiles]->hstrTargetName = DrgAddStrHandle(szFile); 305 ppDItem[ulNumfiles]->fsControl = 0; 306 if (IsFullName(arcfile) && 307 (driveflags[toupper(*arcfile) - 'A'] & DRIVE_REMOVABLE)) 308 ppDItem[ulNumfiles]->fsControl |= DC_REMOVEABLEMEDIA; 309 ppDItem[ulNumfiles]->fsSupportedOps = DO_COPYABLE; 310 ulNumfiles++; 311 } 312 ppDItem[ulNumfiles] = NULL; 313 } 314 } 315 WinSendMsg(hwndCnr, CM_SETRECORDEMPHASIS, MPFROMP(pci), 316 MPFROM2SHORT(TRUE, CRA_SOURCE)); 317 318 Continuing: 319 320 if (!attribute) 316 321 break; 317 pci = WinSendMsg(hwndCnr,CM_QUERYRECORDEMPHASIS,MPFROMP(pci), 318 MPFROMSHORT(attribute)); 319 } // while 320 321 if(ulNumfiles) { 322 pDInfo = DrgAllocDraginfo(ulNumfiles); /* Allocate DRAGINFO */ 323 if(pDInfo) { 324 if((arcfile && *arcfile) || (IsFullName(szBuffer) && 325 (driveflags[toupper(*szBuffer) - 'A'] & DRIVE_NOTWRITEABLE))) 326 pDInfo->usOperation = DO_COPY; 322 pci = WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS, MPFROMP(pci), 323 MPFROMSHORT(attribute)); 324 } // while 325 326 if (ulNumfiles) { 327 pDInfo = DrgAllocDraginfo(ulNumfiles); /* Allocate DRAGINFO */ 328 if (pDInfo) { 329 if ((arcfile && *arcfile) || (IsFullName(szBuffer) && 330 (driveflags[toupper(*szBuffer) - 'A'] & 331 DRIVE_NOTWRITEABLE))) 332 pDInfo->usOperation = DO_COPY; 327 333 else 328 329 if ((!arcfile || !*arcfile) && rooting)330 334 pDInfo->usOperation = DO_DEFAULT; 335 if ((!arcfile || !*arcfile) && rooting) 336 pDInfo->usOperation = DO_LINK; 331 337 pDInfo->hwndSource = (hwndObj) ? hwndObj : hwndCnr; 332 338 // pDInfo->hwndSource = hwndCnr; 333 for (Select = 0L;Select < ulNumfiles;Select++) {334 DrgSetDragitem(pDInfo,/* Set item in DRAGINFO */335 ppDItem[Select],/* Pointer to DRAGITEM */336 337 Select);/* Index of DRAGITEM */338 339 for (Select = 0L; Select < ulNumfiles; Select++) { 340 DrgSetDragitem(pDInfo, /* Set item in DRAGINFO */ 341 ppDItem[Select], /* Pointer to DRAGITEM */ 342 sizeof(DRAGITEM), /* Size of DRAGITEM */ 343 Select); /* Index of DRAGITEM */ 344 free(ppDItem[Select]); 339 345 } 340 346 #ifdef __DEBUG_ALLOC__ … … 345 351 DosPostEventSem(CompactSem); 346 352 347 if (arcfile) {348 349 350 if(ulNumfiles > 1)351 352 353 354 355 356 357 358 } 359 if (!arcfile) {360 if(!ulNumIcon)361 353 if (arcfile) { 354 diFakeIcon.cb = sizeof(DRAGIMAGE); 355 diFakeIcon.cptl = 0; 356 if (ulNumfiles > 1) 357 diFakeIcon.hImage = hptrFile; 358 diFakeIcon.fl = DRG_ICON; 359 diFakeIcon.sizlStretch.cx = 32; 360 diFakeIcon.sizlStretch.cy = 32; 361 diFakeIcon.cxOffset = -16; 362 diFakeIcon.cyOffset = 0; 363 padiIcon = &diFakeIcon; 364 } 365 if (!arcfile) { 366 if (!ulNumIcon) 367 ulNumIcon = ulNumfiles; 362 368 } 363 369 else 364 ulNumIcon = 1L; 365 366 WinSetFocus(HWND_DESKTOP,HWND_DESKTOP); 367 hDrop = DrgDrag(hwndCnr, /* Initiate drag */ 368 pDInfo, /* DRAGINFO structure */ 369 padiIcon, 370 ulNumIcon, 371 VK_ENDDRAG, /* End of drag indicator */ 372 (PVOID)NULL); /* Reserved */ 373 374 DrgFreeDraginfo(pDInfo); /* Free DRAGINFO struct */ 375 if(padiIcon && padiIcon != &diFakeIcon) 376 free(padiIcon); 370 ulNumIcon = 1L; 371 372 WinSetFocus(HWND_DESKTOP, HWND_DESKTOP); 373 hDrop = DrgDrag(hwndCnr, /* Initiate drag */ 374 pDInfo, /* DRAGINFO structure */ 375 padiIcon, ulNumIcon, VK_ENDDRAG, /* End of drag indicator */ 376 (PVOID) NULL); /* Reserved */ 377 378 DrgFreeDraginfo(pDInfo); /* Free DRAGINFO struct */ 379 if (padiIcon && padiIcon != &diFakeIcon) 380 free(padiIcon); 377 381 padiIcon = NULL; 378 WinSetWindowPos(hwndCnr, HWND_TOP,0,0,0,0,SWP_ACTIVATE);382 WinSetWindowPos(hwndCnr, HWND_TOP, 0, 0, 0, 0, SWP_ACTIVATE); 379 383 DosPostEventSem(CompactSem); 380 384 } 381 385 } 382 if (ppDItem)386 if (ppDItem) 383 387 free(ppDItem); 384 if (padiIcon && padiIcon != &diFakeIcon)388 if (padiIcon && padiIcon != &diFakeIcon) 385 389 free(padiIcon); 386 MarkAll(hwndCnr, TRUE,FALSE,TRUE);390 MarkAll(hwndCnr, TRUE, FALSE, TRUE); 387 391 return hDrop; 388 392 } 389 393 390 391 HWND DragList (HWND hwnd,HWND hwndObj,CHAR **list,BOOL moveok){394 HWND DragList(HWND hwnd, HWND hwndObj, CHAR ** list, BOOL moveok) 395 { 392 396 393 397 /* drag a linked list of files */ 394 398 395 BOOL 396 register CHAR 397 PDRAGINFO 398 DRAGITEM **ppDItem = NULL,**ppTest;399 HWND hDrop = (HWND)0;400 register ULONG ulNumfiles = 0L, numdragalloc = 0L,Select,ulNumIcon = 0;401 CHAR szFile[CCHMAXPATH],szBuffer[CCHMAXPATH];402 DRAGIMAGE *padiIcon = NULL,*padiTest;403 FILESTATUS3 404 405 if (!list || !list[0])399 BOOL isdir; 400 register CHAR *p; 401 PDRAGINFO pDInfo = NULL; 402 DRAGITEM **ppDItem = NULL, **ppTest; 403 HWND hDrop = (HWND) 0; 404 register ULONG ulNumfiles = 0L, numdragalloc = 0L, Select, ulNumIcon = 0; 405 CHAR szFile[CCHMAXPATH], szBuffer[CCHMAXPATH]; 406 DRAGIMAGE *padiIcon = NULL, *padiTest; 407 FILESTATUS3 fs3; 408 409 if (!list || !list[0]) 406 410 return hDrop; 407 for (Select = 0;list[Select];Select++) {408 if ((!IsRoot(list[Select]) || !IsValidDrive(*list[Select])) &&409 DosQueryPathInfo(list[Select],FIL_STANDARD,&fs3,sizeof(fs3)))411 for (Select = 0; list[Select]; Select++) { 412 if ((!IsRoot(list[Select]) || !IsValidDrive(*list[Select])) && 413 DosQueryPathInfo(list[Select], FIL_STANDARD, &fs3, sizeof(fs3))) 410 414 continue; 411 strcpy(szBuffer, list[Select]);412 p = strrchr(szBuffer, '\\');413 if (p) {415 strcpy(szBuffer, list[Select]); 416 p = strrchr(szBuffer, '\\'); 417 if (p) { 414 418 p++; 415 strcpy(szFile, p);419 strcpy(szFile, p); 416 420 *p = 0; 417 421 } 418 422 else 419 423 continue; 420 if (*szFile) {424 if (*szFile) { 421 425 isdir = (IsRoot(list[Select])) ? TRUE : 422 ((fs3.attrFile & FILE_DIRECTORY) != 0); 423 if(ulNumfiles + 2L > numdragalloc) { 424 if (!padiIcon) { 425 padiTest = xrealloc(padiIcon,sizeof(DRAGIMAGE) * (numdragalloc + 4L), pszSrcFile, __LINE__); 426 if (!padiTest) 427 break; 428 else 429 padiIcon = padiTest; 430 } 431 else if(!ulNumIcon) { 432 padiIcon[ulNumfiles].cb = sizeof(DRAGIMAGE); 433 padiIcon[ulNumfiles].cptl = 0; 434 padiIcon[ulNumfiles].hImage = hptrLast; 435 padiIcon[ulNumfiles].fl = DRG_ICON; 436 padiIcon[ulNumfiles].sizlStretch.cx = 32; 437 padiIcon[ulNumfiles].sizlStretch.cy = 32; 438 padiIcon[ulNumfiles].cxOffset = -16 + (ulNumfiles * 4); 439 padiIcon[ulNumfiles].cyOffset = 0 + (ulNumfiles * 7); 440 ulNumIcon = ulNumfiles + 1; 441 } 442 ppTest = xrealloc(ppDItem,sizeof(DRAGITEM *) * (numdragalloc + 4L), pszSrcFile, __LINE__); 443 if (!ppTest) 444 break; 445 else { 446 ppDItem = ppTest; 447 numdragalloc += 4L; 448 } 426 ((fs3.attrFile & FILE_DIRECTORY) != 0); 427 if (ulNumfiles + 2L > numdragalloc) { 428 if (!padiIcon) { 429 padiTest = 430 xrealloc(padiIcon, sizeof(DRAGIMAGE) * (numdragalloc + 4L), 431 pszSrcFile, __LINE__); 432 if (!padiTest) 433 break; 434 else 435 padiIcon = padiTest; 436 } 437 else if (!ulNumIcon) { 438 padiIcon[ulNumfiles].cb = sizeof(DRAGIMAGE); 439 padiIcon[ulNumfiles].cptl = 0; 440 padiIcon[ulNumfiles].hImage = hptrLast; 441 padiIcon[ulNumfiles].fl = DRG_ICON; 442 padiIcon[ulNumfiles].sizlStretch.cx = 32; 443 padiIcon[ulNumfiles].sizlStretch.cy = 32; 444 padiIcon[ulNumfiles].cxOffset = -16 + (ulNumfiles * 4); 445 padiIcon[ulNumfiles].cyOffset = 0 + (ulNumfiles * 7); 446 ulNumIcon = ulNumfiles + 1; 447 } 448 ppTest = 449 xrealloc(ppDItem, sizeof(DRAGITEM *) * (numdragalloc + 4L), 450 pszSrcFile, __LINE__); 451 if (!ppTest) 452 break; 453 else { 454 ppDItem = ppTest; 455 numdragalloc += 4L; 456 } 449 457 } 450 458 ppDItem[ulNumfiles] = xmalloc(sizeof(DRAGITEM), pszSrcFile, __LINE__); 451 459 if (!ppDItem[ulNumfiles]) 452 460 break; 453 461 else { 454 if(!ulNumIcon) {455 456 457 458 459 460 461 462 463 464 memset(ppDItem[ulNumfiles],0,sizeof(DRAGITEM));465 ppDItem[ulNumfiles]->hwndItem = (hwndObj) ? hwndObj : hwnd;/* Initialize DRAGITEM */466 467 ppDItem[ulNumfiles]->ulItemID = (ULONG)Select;468 469 470 471 472 473 474 if(IsFullName(list[Select]) &&475 476 477 478 if(moveok && IsFullName(list[Select]) &&479 480 481 if(IsRoot(list[Select]))482 483 484 485 } 486 } 487 } 462 if (!ulNumIcon) { 463 padiIcon[ulNumfiles].cb = sizeof(DRAGIMAGE); 464 padiIcon[ulNumfiles].cptl = 0; 465 padiIcon[ulNumfiles].hImage = (isdir) ? hptrDir : hptrFile; 466 padiIcon[ulNumfiles].fl = DRG_ICON; 467 padiIcon[ulNumfiles].sizlStretch.cx = 32; 468 padiIcon[ulNumfiles].sizlStretch.cy = 32; 469 padiIcon[ulNumfiles].cxOffset = -16 + (ulNumfiles * 3); 470 padiIcon[ulNumfiles].cyOffset = 0 + (ulNumfiles * 6); 471 } 472 memset(ppDItem[ulNumfiles], 0, sizeof(DRAGITEM)); 473 ppDItem[ulNumfiles]->hwndItem = (hwndObj) ? hwndObj : hwnd; /* Initialize DRAGITEM */ 474 // ppDItem[ulNumfiles]->hwndItem = hwnd; 475 ppDItem[ulNumfiles]->ulItemID = (ULONG) Select; 476 ppDItem[ulNumfiles]->hstrType = DrgAddStrHandle(DRT_UNKNOWN); 477 ppDItem[ulNumfiles]->hstrRMF = DrgAddStrHandle(DRMDRFLIST); 478 ppDItem[ulNumfiles]->hstrContainerName = DrgAddStrHandle(szBuffer); 479 ppDItem[ulNumfiles]->hstrSourceName = DrgAddStrHandle(szFile); 480 ppDItem[ulNumfiles]->hstrTargetName = DrgAddStrHandle(szFile); 481 ppDItem[ulNumfiles]->fsControl = (isdir) ? DC_CONTAINER : 0; 482 if (IsFullName(list[Select]) && 483 (driveflags[toupper(*list[Select]) - 'A'] & DRIVE_REMOVABLE)) 484 ppDItem[ulNumfiles]->fsControl |= DC_REMOVEABLEMEDIA; 485 ppDItem[ulNumfiles]->fsSupportedOps = DO_COPYABLE | DO_LINKABLE; 486 if (moveok && IsFullName(list[Select]) && 487 !(driveflags[toupper(*list[Select]) - 'A'] & DRIVE_NOTWRITEABLE)) 488 ppDItem[ulNumfiles]->fsSupportedOps |= DO_MOVEABLE; 489 if (IsRoot(list[Select])) 490 ppDItem[ulNumfiles]->fsControl = DO_LINKABLE; 491 ulNumfiles++; 492 ppDItem[ulNumfiles] = NULL; 493 } 494 } 495 } // for 488 496 489 497 if (ulNumfiles) { 490 pDInfo = DrgAllocDraginfo(ulNumfiles); 498 pDInfo = DrgAllocDraginfo(ulNumfiles); /* Allocate DRAGINFO */ 491 499 if (pDInfo) { 492 500 if ((IsFullName(szBuffer) && 493 494 501 (driveflags[toupper(*szBuffer) - 'A'] & DRIVE_NOTWRITEABLE))) 502 pDInfo->usOperation = DO_COPY; 495 503 else 496 504 pDInfo->usOperation = DO_DEFAULT; 497 505 if (IsRoot(list[0])) 498 506 pDInfo->usOperation = DO_LINK; 499 507 pDInfo->hwndSource = (hwndObj) ? hwndObj : hwnd; 500 508 // pDInfo->hwndSource = hwnd; 501 for (Select = 0L; Select < ulNumfiles;Select++) {502 DrgSetDragitem(pDInfo,/* Set item in DRAGINFO */503 ppDItem[Select],/* Pointer to DRAGITEM */504 sizeof(DRAGITEM),/* Size of DRAGITEM */505 Select);/* Index of DRAGITEM */506 507 } 509 for (Select = 0L; Select < ulNumfiles; Select++) { 510 DrgSetDragitem(pDInfo, /* Set item in DRAGINFO */ 511 ppDItem[Select], /* Pointer to DRAGITEM */ 512 sizeof(DRAGITEM), /* Size of DRAGITEM */ 513 Select); /* Index of DRAGITEM */ 514 free(ppDItem[Select]); 515 } // for 508 516 #ifdef __DEBUG_ALLOC__ 509 517 _heap_check(); … … 513 521 DosPostEventSem(CompactSem); 514 522 515 if(!ulNumIcon) 516 ulNumIcon = ulNumfiles; 517 518 WinSetFocus(HWND_DESKTOP,HWND_DESKTOP); 519 hDrop = DrgDrag(hwnd, /* Initiate drag */ 520 pDInfo, /* DRAGINFO structure */ 521 padiIcon, 522 ulNumIcon, 523 VK_ENDDRAG, /* End of drag indicator */ 524 (PVOID)NULL); /* Reserved */ 525 526 DrgFreeDraginfo(pDInfo); /* Free DRAGINFO struct */ 523 if (!ulNumIcon) 524 ulNumIcon = ulNumfiles; 525 526 WinSetFocus(HWND_DESKTOP, HWND_DESKTOP); 527 hDrop = DrgDrag(hwnd, /* Initiate drag */ 528 pDInfo, /* DRAGINFO structure */ 529 padiIcon, ulNumIcon, VK_ENDDRAG, /* End of drag indicator */ 530 (PVOID) NULL); /* Reserved */ 531 532 DrgFreeDraginfo(pDInfo); /* Free DRAGINFO struct */ 527 533 free(padiIcon); 528 534 padiIcon = NULL; 529 WinSetWindowPos(hwnd, HWND_TOP,0,0,0,0,SWP_ACTIVATE);535 WinSetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_ACTIVATE); 530 536 DosPostEventSem(CompactSem); 531 537 } 532 538 } 533 if (ppDItem)539 if (ppDItem) 534 540 free(ppDItem); 535 if (padiIcon)541 if (padiIcon) 536 542 free(padiIcon); 537 543 return hDrop; 538 544 } 539 545 540 541 546 #ifdef NEVER 542 547 543 BOOL PickUp (HWND hwndCnr,HWND hwndObj,PCNRDRAGINIT pcd) { 544 545 PCNRITEM pci; 546 BOOL loop = TRUE; 547 PDRAGINFO pdinfoOld = NULL,pdinfoCurrent = NULL; 548 ULONG cditem = 0; 549 DRAGITEM ditem; 548 BOOL PickUp(HWND hwndCnr, HWND hwndObj, PCNRDRAGINIT pcd) 549 { 550 551 PCNRITEM pci; 552 BOOL loop = TRUE; 553 PDRAGINFO pdinfoOld = NULL, pdinfoCurrent = NULL; 554 ULONG cditem = 0; 555 DRAGITEM ditem; 550 556 DRAGIMAGE diFakeIcon; 551 CHAR szDir[CCHMAXPATH],szFile[CCHMAXPATH],*p;552 553 pci = (PCNRITEM) pcd->pRecord;554 if (pci && (INT)pci != -1) {555 if (pci->rc.flRecordAttr & CRA_SELECTED) {557 CHAR szDir[CCHMAXPATH], szFile[CCHMAXPATH], *p; 558 559 pci = (PCNRITEM) pcd->pRecord; 560 if (pci && (INT) pci != -1) { 561 if (pci->rc.flRecordAttr & CRA_SELECTED) { 556 562 loop = TRUE; 557 pci = WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS,558 MPFROMLONG(CMA_FIRST),MPFROMSHORT(CRA_SELECTED));559 } 560 while (pci && (INT)pci != -1 && *pci->szFileName) {561 if (pdinfoOld || DrgQueryDragStatus() & DGS_LAZYDRAGINPROGRESS) {562 if(!pdinfoOld)563 564 if(pdinfoOld) {565 566 pdinfoCurrent = DrgReallocDraginfo(pdinfoOld,cditem);567 568 563 pci = WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS, 564 MPFROMLONG(CMA_FIRST), MPFROMSHORT(CRA_SELECTED)); 565 } 566 while (pci && (INT) pci != -1 && *pci->szFileName) { 567 if (pdinfoOld || DrgQueryDragStatus() & DGS_LAZYDRAGINPROGRESS) { 568 if (!pdinfoOld) 569 pdinfoOld = DrgQueryDraginfoPtr(NULL); 570 if (pdinfoOld) { 571 cditem = pdinfoOld->cditem + 1; 572 pdinfoCurrent = DrgReallocDraginfo(pdinfoOld, cditem); 573 pdinfoOld = pdinfoCurrent; 574 } 569 575 } 570 576 else 571 pdinfoCurrent = pdinfoOld = DrgAllocDraginfo(1); 572 if(pdinfoCurrent) { 573 strcpy(szDir,pci->szFileName); 574 p = szDir; 575 while(*p) { 576 if(*p == '/') 577 *p = '\\'; 578 p++; 579 } 580 p = strrchr(szDir,'\\'); 581 if(p) { 582 *p = 0; 583 p++; 584 strcpy(szFile,p); 585 strcat(szDir,"\\"); 586 } 587 else { 588 strcpy(szFile,pci->szFileName); 589 *szDir = 0; 590 } 591 ditem.ulItemID = (ULONG)pci; 592 ditem.hwndItem = (hwndObj) ? hwndObj : hwndCnr; 593 ditem.hstrType = DrgAddStrHandle(DRT_UNKNOWN); 594 ditem.hstrRMF = 595 DrgAddStrHandle(DRMDRFLIST); 596 ditem.hstrContainerName = DrgAddStrHandle(szDir); 597 ditem.hstrSourceName = DrgAddStrHandle(szFile); 598 ditem.hstrTargetName = DrgAddStrHandle(szFile); 599 ditem.fsControl = 0; 600 if(IsRoot(pci->szFileName) || (pci->attrFile & FILE_DIRECTORY) != 0) 601 ditem.fsControl |= DC_CONTAINER; 602 if(IsFullName(pci->szFileName) && 603 (driveflags[toupper(*pci->szFileName) - 'A'] & DRIVE_REMOVABLE)) 604 ditem.fsControl |= DC_REMOVEABLEMEDIA; 605 ditem.fsSupportedOps = DO_COPYABLE | DO_LINKABLE; 606 if(IsFullName(pci->szFileName) && 607 !(driveflags[toupper(*pci->szFileName) - 'A'] & DRIVE_NOTWRITEABLE)) 608 ditem.fsSupportedOps |= DO_MOVEABLE; 609 if(IsRoot(pci->szFileName)) 610 ditem.fsSupportedOps = DO_LINKABLE; 611 memset(&diFakeIcon,0,sizeof(DRAGIMAGE)); 612 diFakeIcon.hImage = pci->rc.hptrIcon; 613 diFakeIcon.cb = sizeof(DRAGIMAGE); 614 diFakeIcon.cptl = 0; 615 diFakeIcon.fl = DRG_ICON; 616 diFakeIcon.sizlStretch.cx = 32; 617 diFakeIcon.sizlStretch.cy = 32; 618 diFakeIcon.cxOffset = -16; 619 diFakeIcon.cyOffset = 0; 620 if(IsFullName(pci->szFileName) && 621 (driveflags[toupper(*pci->szFileName) - 'A'] & DRIVE_NOTWRITEABLE)) 622 pdinfoCurrent->usOperation = DO_COPY; 623 else 624 pdinfoCurrent->usOperation = DO_DEFAULT; 625 if(IsRoot(pci->szFileName)) 626 pdinfoCurrent->usOperation = DO_LINK; 627 pdinfoCurrent->hwndSource = (hwndObj) ? hwndObj : hwndCnr; 628 DrgSetDragitem(pdinfoCurrent, 629 &ditem, 630 sizeof(DRAGITEM), 631 cditem); 632 } 633 if(!loop) 634 break; 635 pci = WinSendMsg(hwndCnr,CM_QUERYRECORDEMPHASIS, 636 MPFROMP(pci),MPFROMSHORT(CRA_SELECTED)); 637 } 638 if(pdinfoCurrent) 639 return DrgLazyDrag(hwndCnr,pdinfoCurrent,&diFakeIcon,1,NULL); 577 pdinfoCurrent = pdinfoOld = DrgAllocDraginfo(1); 578 if (pdinfoCurrent) { 579 strcpy(szDir, pci->szFileName); 580 p = szDir; 581 while (*p) { 582 if (*p == '/') 583 *p = '\\'; 584 p++; 585 } 586 p = strrchr(szDir, '\\'); 587 if (p) { 588 *p = 0; 589 p++; 590 strcpy(szFile, p); 591 strcat(szDir, "\\"); 592 } 593 else { 594 strcpy(szFile, pci->szFileName); 595 *szDir = 0; 596 } 597 ditem.ulItemID = (ULONG) pci; 598 ditem.hwndItem = (hwndObj) ? hwndObj : hwndCnr; 599 ditem.hstrType = DrgAddStrHandle(DRT_UNKNOWN); 600 ditem.hstrRMF = DrgAddStrHandle(DRMDRFLIST); 601 ditem.hstrContainerName = DrgAddStrHandle(szDir); 602 ditem.hstrSourceName = DrgAddStrHandle(szFile); 603 ditem.hstrTargetName = DrgAddStrHandle(szFile); 604 ditem.fsControl = 0; 605 if (IsRoot(pci->szFileName) || (pci->attrFile & FILE_DIRECTORY) != 0) 606 ditem.fsControl |= DC_CONTAINER; 607 if (IsFullName(pci->szFileName) && 608 (driveflags[toupper(*pci->szFileName) - 'A'] & DRIVE_REMOVABLE)) 609 ditem.fsControl |= DC_REMOVEABLEMEDIA; 610 ditem.fsSupportedOps = DO_COPYABLE | DO_LINKABLE; 611 if (IsFullName(pci->szFileName) && 612 !(driveflags[toupper(*pci->szFileName) - 'A'] & 613 DRIVE_NOTWRITEABLE)) 614 ditem.fsSupportedOps |= DO_MOVEABLE; 615 if (IsRoot(pci->szFileName)) 616 ditem.fsSupportedOps = DO_LINKABLE; 617 memset(&diFakeIcon, 0, sizeof(DRAGIMAGE)); 618 diFakeIcon.hImage = pci->rc.hptrIcon; 619 diFakeIcon.cb = sizeof(DRAGIMAGE); 620 diFakeIcon.cptl = 0; 621 diFakeIcon.fl = DRG_ICON; 622 diFakeIcon.sizlStretch.cx = 32; 623 diFakeIcon.sizlStretch.cy = 32; 624 diFakeIcon.cxOffset = -16; 625 diFakeIcon.cyOffset = 0; 626 if (IsFullName(pci->szFileName) && 627 (driveflags[toupper(*pci->szFileName) - 'A'] & 628 DRIVE_NOTWRITEABLE)) 629 pdinfoCurrent->usOperation = DO_COPY; 630 else 631 pdinfoCurrent->usOperation = DO_DEFAULT; 632 if (IsRoot(pci->szFileName)) 633 pdinfoCurrent->usOperation = DO_LINK; 634 pdinfoCurrent->hwndSource = (hwndObj) ? hwndObj : hwndCnr; 635 DrgSetDragitem(pdinfoCurrent, &ditem, sizeof(DRAGITEM), cditem); 636 } 637 if (!loop) 638 break; 639 pci = WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS, 640 MPFROMP(pci), MPFROMSHORT(CRA_SELECTED)); 641 } 642 if (pdinfoCurrent) 643 return DrgLazyDrag(hwndCnr, pdinfoCurrent, &diFakeIcon, 1, NULL); 640 644 } 641 645 return FALSE;
Note:
See TracChangeset
for help on using the changeset viewer.