source: trunk/dll/draglist.c@ 2

Last change on this file since 2 was 2, checked in by root, 23 years ago

Initial revision

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