source: trunk/dll/chklist.c@ 201

Last change on this file since 201 was 129, checked in by root, 21 years ago

Allow DND_TARGET to hold CCHMAXPATH

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 18.6 KB
Line 
1
2/***********************************************************************
3
4 $Id: chklist.c 129 2005-01-22 00:11:34Z root $
5
6 Main window
7
8 Copyright (c) 1993-98 M. Kimes
9 Copyright (c) 2005 Steven H.Levine
10
11 Revisions 10 Jan 05 SHL Allow DND_TARGET to hold CCHMAXPATH
12
13***********************************************************************/
14
15#define INCL_DOS
16#define INCL_WIN
17#define INCL_GPI
18
19#include <os2.h>
20#include <stdio.h>
21#include <stdlib.h>
22#include <string.h>
23#include <ctype.h>
24#include "fm3dll.h"
25#include "fm3dlg.h"
26#include "fm3str.h"
27
28#pragma data_seg(DATA1)
29#pragma alloc_text(CHECKLIST,CheckListProc)
30#pragma alloc_text(DNDLIST,DropListProc)
31#pragma alloc_text(MISC7,PosOverOkay,CenterOverWindow,PopupMenu)
32
33
34VOID CenterOverWindow (HWND hwnd) {
35
36 SWP swp;
37 POINTL ptl;
38
39 if(!fDontMoveMouse) {
40 if(WinQueryWindowPos(hwnd,&swp)) {
41 ptl.x = swp.x + (swp.cx / 2);
42 ptl.y = swp.y + (swp.cy / 2);
43 WinMapWindowPoints(WinQueryWindow(hwnd,QW_PARENT),HWND_DESKTOP,&ptl,1L);
44 WinSetPointerPos(HWND_DESKTOP,ptl.x,ptl.y);
45 }
46 }
47}
48
49
50BOOL PopupMenu (HWND hwndParent,HWND hwndOwner,HWND hwndMenu) {
51
52 POINTL ptl;
53 BOOL rc;
54
55 if(!WinQueryPointerPos(HWND_DESKTOP,&ptl))
56 ptl.x = ptl.y = 32;
57 WinMapWindowPoints(HWND_DESKTOP,hwndParent,&ptl,1L);
58 rc = WinPopupMenu(hwndParent,hwndOwner,hwndMenu,
59 ptl.x,ptl.y,0,
60 PU_HCONSTRAIN | PU_VCONSTRAIN |
61 PU_KEYBOARD | PU_MOUSEBUTTON1);
62 if(rc)
63 CenterOverWindow(hwndMenu);
64 return rc;
65}
66
67
68VOID PosOverOkay (HWND hwnd) {
69
70 SWP swp;
71 POINTL ptl;
72
73 if(!fDontMoveMouse) {
74 if(WinQueryWindowPos(WinWindowFromID(hwnd,DID_OK),&swp)) {
75 ptl.x = swp.x + (swp.cx / 2);
76 ptl.y = swp.y + (swp.cy / 2);
77 WinMapWindowPoints(hwnd,HWND_DESKTOP,&ptl,1L);
78 WinSetPointerPos(HWND_DESKTOP,ptl.x,ptl.y);
79 }
80 }
81}
82
83
84MRESULT EXPENTRY CheckListProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2) {
85
86 CHECKLIST *cl;
87
88 switch(msg) {
89 case WM_INITDLG:
90 if(mp2) {
91
92 SHORT x;
93
94 WinSetWindowPtr(hwnd,0,(PVOID)mp2);
95 cl = (CHECKLIST *)mp2;
96 if(!cl->list || !cl->list[0]) {
97 WinDismissDlg(hwnd,0);
98 break;
99 }
100 WinSetDlgItemText(hwnd,CHECK_PROMPT,cl->prompt);
101 for(x = 0;cl->list[x];x++) {
102 WinSendDlgItemMsg(hwnd,CHECK_LISTBOX,LM_INSERTITEM,
103 MPFROM2SHORT(LIT_END,0),
104 MPFROMP(cl->list[x]));
105 WinSendDlgItemMsg(hwnd,CHECK_LISTBOX,LM_SELECTITEM,
106 MPFROM2SHORT(x,0),MPFROMSHORT(TRUE));
107 }
108 PosOverOkay(hwnd);
109 WinEnableWindow(WinWindowFromID(hwnd,CHECK_INFO),
110 ((cl->flags & CHECK_FILES) != 0));
111 WinShowWindow(WinWindowFromID(hwnd,CHECK_INFO),
112 ((cl->flags & CHECK_FILES) != 0));
113 {
114 HBITMAP hbm,hbmd,hbmdd;
115 HPS hps;
116
117 hps = WinGetPS(WinWindowFromID(hwnd,CHECK_BITMAP));
118 hbm = GpiLoadBitmap(hps,0,cl->cmd,28,28);
119 if(hbm) {
120 hbmd = (HBITMAP)WinSendDlgItemMsg(hwnd,CHECK_BITMAP,SM_QUERYHANDLE,
121 MPVOID,MPVOID);
122 hbmdd = (HBITMAP)WinSendDlgItemMsg(hwnd,CHECK_BITMAP,SM_SETHANDLE,
123 MPFROMLONG(hbm),MPVOID);
124 if(hbmdd && hbmd && hbmd != hbmdd)
125 GpiDeleteBitmap(hbmd);
126 }
127 if(hps)
128 WinReleasePS(hps);
129 WinSetWindowPos(WinWindowFromID(hwnd,CHECK_BITMAP),HWND_TOP,
130 0,0,28,28,SWP_SIZE);
131 }
132 }
133 else
134 WinDismissDlg(hwnd,0);
135 break;
136
137 case WM_ADJUSTWINDOWPOS:
138 PostMsg(hwnd,UM_SETDIR,MPVOID,MPVOID);
139 break;
140
141 case UM_SETDIR:
142 PaintRecessedWindow(WinWindowFromID(hwnd,CHECK_HELP),(HPS)0,FALSE,TRUE);
143 return 0;
144
145 case WM_CONTROL:
146 switch(SHORT1FROMMP(mp1)) {
147 case CHECK_LISTBOX:
148 switch(SHORT2FROMMP(mp1)) {
149 case LN_ENTER:
150 {
151 SHORT x;
152 CHAR szBuffer[CCHMAXPATH];
153
154 x = (SHORT)WinSendDlgItemMsg(hwnd,CHECK_LISTBOX,
155 LM_QUERYSELECTION,
156 MPFROMSHORT(LIT_FIRST),MPVOID);
157 if(x >= 0) {
158 *szBuffer = 0;
159 WinSendDlgItemMsg(hwnd,CHECK_LISTBOX,LM_QUERYITEMTEXT,
160 MPFROM2SHORT(x,CCHMAXPATH),
161 MPFROMP(szBuffer));
162 if(*szBuffer)
163 QuickView(hwnd,szBuffer);
164 }
165 }
166 break;
167 }
168 break;
169 }
170 return 0;
171
172 case WM_COMMAND:
173 switch(SHORT1FROMMP(mp1)) {
174 case CHECK_INFO:
175 cl = INSTDATA(hwnd);
176 if(cl)
177 WinDlgBox(HWND_DESKTOP,hwnd,FileInfoProc,FM3ModHandle,
178 FLE_FRAME,(PVOID)cl->list);
179 break;
180
181 case IDM_HELP:
182 if(hwndHelp)
183 WinSendMsg(hwndHelp,HM_DISPLAY_HELP,
184 MPFROM2SHORT(HELP_CHECKLIST,0),
185 MPFROMSHORT(HM_RESOURCEID));
186 break;
187
188 case DID_OK:
189 cl = INSTDATA(hwnd);
190 if(cl) {
191
192 CHAR szBuffer[CCHMAXPATH + 1];
193 INT numfiles = 0,numalloc = 0,error;
194 SHORT x;
195
196 FreeList(cl->list);
197 cl->list = NULL;
198 x = (SHORT)WinSendDlgItemMsg(hwnd,CHECK_LISTBOX,LM_QUERYSELECTION,
199 MPFROMSHORT(LIT_FIRST),MPVOID);
200 if(x >= 0) {
201 do {
202 *szBuffer = 0;
203 WinSendDlgItemMsg(hwnd,CHECK_LISTBOX,LM_QUERYITEMTEXT,
204 MPFROM2SHORT(x,CCHMAXPATH),
205 MPFROMP(szBuffer));
206 if(*szBuffer) {
207 error = AddToList(szBuffer,&cl->list,&numfiles,&numalloc);
208 if(error) {
209 DosBeep(250,100);
210 break;
211 }
212 }
213 x = (SHORT)WinSendDlgItemMsg(hwnd,CHECK_LISTBOX,
214 LM_QUERYSELECTION,
215 MPFROMSHORT(x),MPVOID);
216 } while(x >= 0);
217 }
218 WinDismissDlg(hwnd,1);
219 }
220 else
221 WinDismissDlg(hwnd,0);
222 break;
223
224 case DID_CANCEL:
225 WinDismissDlg(hwnd,0);
226 break;
227 }
228 return 0;
229 }
230 return WinDefDlgProc(hwnd,msg,mp1,mp2);
231}
232
233
234MRESULT EXPENTRY DropListProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2) {
235
236 CHECKLIST *cl;
237 static BOOL Shadow = FALSE,Wild = FALSE;
238
239 switch(msg) {
240 case WM_INITDLG:
241 if(mp2) {
242
243 SHORT x;
244
245 WinSetWindowPtr(hwnd,0,(PVOID)mp2);
246 cl = (CHECKLIST *)mp2;
247 if(!cl->list || !cl->list[0]) {
248 WinDismissDlg(hwnd,0);
249 break;
250 }
251 if(IsRoot(cl->list[0])) {
252 WinDismissDlg(hwnd,DND_COMPARE);
253 break;
254 }
255 WinSendDlgItemMsg(hwnd,DND_LISTBOX,LM_DELETEALL,MPVOID,MPVOID);
256 for(x = 0;cl->list[x];x++) {
257 WinSendDlgItemMsg(hwnd,DND_LISTBOX,LM_INSERTITEM,
258 MPFROM2SHORT(LIT_END,0),
259 MPFROMP(cl->list[x]));
260 WinSendDlgItemMsg(hwnd,DND_LISTBOX,LM_SELECTITEM,
261 MPFROM2SHORT(x,0),MPFROMSHORT(TRUE));
262 }
263 WinSendDlgItemMsg(hwnd,DND_TARGET,EM_SETTEXTLIMIT, (MPARAM)CCHMAXPATH,(MPARAM)0);
264 PostMsg(hwnd,UM_UNDO,MPVOID,MPVOID);
265 }
266 else
267 WinDismissDlg(hwnd,0);
268 break;
269
270 case UM_UNDO:
271 cl = INSTDATA(hwnd);
272 if(cl) {
273
274 CHAR *p;
275
276 WinSetDlgItemText(hwnd,DND_TARGET,cl->prompt);
277 WinEnableWindow(WinWindowFromID(hwnd,DND_LAUNCH),
278 (IsExecutable(cl->prompt)));
279 WinEnableWindow(WinWindowFromID(hwnd,DND_COPY),TRUE);
280 WinEnableWindow(WinWindowFromID(hwnd,DND_MOVE),TRUE);
281 WinEnableWindow(WinWindowFromID(hwnd,DND_RENAME),TRUE);
282 WinEnableWindow(WinWindowFromID(hwnd,DND_OBJECT),TRUE);
283 WinEnableWindow(WinWindowFromID(hwnd,DND_SHADOW),TRUE);
284 WinEnableWindow(WinWindowFromID(hwnd,DND_EXTRACT),TRUE);
285 WinEnableWindow(WinWindowFromID(hwnd,DND_SETICON),FALSE);
286 p = strrchr(cl->list[0],'.');
287 if(p) {
288 p++;
289 if(!stricmp(p,"ICO") || !stricmp(p,"PTR"))
290 WinEnableWindow(WinWindowFromID(hwnd,DND_SETICON),TRUE);
291 }
292 if(IsFile(cl->prompt)) {
293 WinEnableWindow(WinWindowFromID(hwnd,DND_OBJECT),FALSE);
294 WinEnableWindow(WinWindowFromID(hwnd,DND_SHADOW),FALSE);
295 WinEnableWindow(WinWindowFromID(hwnd,DND_EXTRACT),FALSE);
296 WinEnableWindow(WinWindowFromID(hwnd,DND_RENAME),FALSE);
297 }
298 else {
299
300 ARC_TYPE *info;
301
302 info = find_type(cl->list[0],NULL);
303 if(!info)
304 WinEnableWindow(WinWindowFromID(hwnd,DND_EXTRACT),FALSE);
305 }
306 if(Shadow)
307 WinCheckButton(hwnd,DND_SHADOW,TRUE);
308 if(Wild)
309 WinCheckButton(hwnd,DND_RENAME,TRUE);
310 PostMsg(hwnd,UM_SETUP,MPVOID,MPVOID);
311 if(cl->prompt && isalpha(*cl->prompt) &&
312 (driveflags[toupper(*cl->prompt) - 'A'] & DRIVE_NOTWRITEABLE)) {
313 WinEnableWindow(WinWindowFromID(hwnd,DND_COPY),FALSE);
314 WinEnableWindow(WinWindowFromID(hwnd,DND_MOVE),FALSE);
315 WinEnableWindow(WinWindowFromID(hwnd,DND_RENAME),FALSE);
316 WinEnableWindow(WinWindowFromID(hwnd,DND_OBJECT),FALSE);
317 WinEnableWindow(WinWindowFromID(hwnd,DND_SHADOW),FALSE);
318 WinEnableWindow(WinWindowFromID(hwnd,DND_EXTRACT),FALSE);
319 }
320 if(cl->prompt && IsFile(cl->prompt) == 1) {
321
322 ARC_TYPE *info;
323
324 info = find_type(cl->prompt,NULL);
325 if(!info) {
326 WinEnableWindow(WinWindowFromID(hwnd,DND_COPY),FALSE);
327 WinEnableWindow(WinWindowFromID(hwnd,DND_MOVE),FALSE);
328 WinEnableWindow(WinWindowFromID(hwnd,DND_RENAME),FALSE);
329 WinEnableWindow(WinWindowFromID(hwnd,DND_OBJECT),FALSE);
330 WinEnableWindow(WinWindowFromID(hwnd,DND_SHADOW),FALSE);
331 WinEnableWindow(WinWindowFromID(hwnd,DND_EXTRACT),FALSE);
332 }
333 }
334 }
335 break;
336
337 case UM_SETUP:
338 cl = WinQueryWindowPtr(hwnd,0);
339 if(cl) {
340 if(cl->flags == DO_MOVE)
341 WinSetFocus(HWND_DESKTOP,WinWindowFromID(hwnd,DND_MOVE));
342 else if(cl->flags == DO_LINK)
343 WinSetFocus(HWND_DESKTOP,WinWindowFromID(hwnd,DND_COMPARE));
344 else
345 WinSetFocus(HWND_DESKTOP,WinWindowFromID(hwnd,DND_COPY));
346 }
347 return 0;
348
349 case WM_ADJUSTWINDOWPOS:
350 PostMsg(hwnd,UM_SETDIR,MPVOID,MPVOID);
351 break;
352
353 case UM_SETDIR:
354 PaintRecessedWindow(WinWindowFromID(hwnd,DND_HELP),(HPS)0,FALSE,TRUE);
355 return 0;
356
357 case WM_CONTROL:
358 switch(SHORT1FROMMP(mp1)) {
359 case DND_LISTBOX:
360 switch(SHORT2FROMMP(mp1)) {
361 case LN_SETFOCUS:
362 WinSetDlgItemText(hwnd,DND_HELP,
363 GetPString(IDS_DNDLISTBOXHELPTEXT));
364 break;
365 case LN_KILLFOCUS:
366 WinSetDlgItemText(hwnd,DND_HELP,
367 GetPString(IDS_DNDHELPTEXT));
368 break;
369 case LN_ENTER:
370 {
371 SHORT x;
372 CHAR szBuffer[CCHMAXPATH];
373
374 x = (SHORT)WinSendDlgItemMsg(hwnd,DND_LISTBOX,LM_QUERYSELECTION,
375 MPFROMSHORT(LIT_FIRST),MPVOID);
376 if(x >= 0) {
377 *szBuffer = 0;
378 WinSendDlgItemMsg(hwnd,DND_LISTBOX,LM_QUERYITEMTEXT,
379 MPFROM2SHORT(x,CCHMAXPATH),
380 MPFROMP(szBuffer));
381 if(*szBuffer)
382 QuickView(hwnd,szBuffer);
383 }
384 }
385 break;
386 }
387 break;
388 case DND_TARGET:
389 switch(SHORT2FROMMP(mp1)) {
390 case EN_SETFOCUS:
391 WinSetDlgItemText(hwnd,DND_HELP,
392 GetPString(IDS_DNDTARGETHELPTEXT));
393 break;
394 case EN_KILLFOCUS:
395 WinSetDlgItemText(hwnd,DND_HELP,
396 GetPString(IDS_DNDHELPTEXT));
397 break;
398 }
399 break;
400 }
401 return 0;
402
403 case WM_COMMAND:
404 switch(SHORT1FROMMP(mp1)) {
405 case IDM_HELP:
406 if(hwndHelp)
407 WinSendMsg(hwndHelp,HM_DISPLAY_HELP,
408 MPFROM2SHORT(HELP_DNDDLG,0),
409 MPFROMSHORT(HM_RESOURCEID));
410 break;
411
412 case DND_INFO:
413 cl = INSTDATA(hwnd);
414 if(cl)
415 WinDlgBox(HWND_DESKTOP,hwnd,FileInfoProc,FM3ModHandle,
416 FLE_FRAME,(PVOID)cl->list);
417 break;
418
419 case DND_CHANGETARGET:
420 cl = INSTDATA(hwnd);
421 if(cl) {
422 if(cl->prompt && *cl->prompt) {
423 if(!IsFile(cl->prompt)) {
424
425 CHAR newpath[CCHMAXPATH];
426
427 strcpy(newpath,cl->prompt);
428 if(WinDlgBox(HWND_DESKTOP,hwnd,WalkAllDlgProc,
429 FM3ModHandle,WALK_FRAME,
430 MPFROMP(newpath)) && *newpath) {
431 strcpy(cl->prompt,newpath);
432 PostMsg(hwnd,UM_UNDO,MPVOID,MPVOID);
433 }
434 }
435 else {
436
437 FILEDLG fdlg;
438 FILESTATUS3 fs3;
439 CHAR drive[3],*pdrive = drive,
440 filename[CCHMAXPATH],*p;
441
442 memset(&fdlg,0,sizeof(FILEDLG));
443 fdlg.cbSize = (ULONG)sizeof(FILEDLG);
444 fdlg.fl = FDS_HELPBUTTON | FDS_CENTER |
445 FDS_OPEN_DIALOG | FDS_CUSTOM;
446 fdlg.pszTitle = GetPString(IDS_NEWTARGETTEXT);
447 fdlg.pszOKButton = GetPString(IDS_CHANGETEXT);
448 *drive = *cl->prompt;
449 drive[1] = ':';
450 drive[2] = 0;
451 fdlg.pszIDrive = pdrive;
452 strcpy(fdlg.szFullFile,cl->prompt);
453 p = strrchr(fdlg.szFullFile,'\\');
454 if(p)
455 *p = 0;
456 strcat(fdlg.szFullFile,"\\*");
457
458 fdlg.pfnDlgProc = (PFNWP)CustomFileDlg;
459 fdlg.hMod = FM3ModHandle;
460 fdlg.usDlgId = FDLG_FRAME;
461
462 if(WinFileDlg(HWND_DESKTOP,
463 hwnd,
464 &fdlg)) {
465 if(fdlg.lReturn != DID_CANCEL &&
466 !fdlg.lSRC) {
467 if(!DosQueryPathInfo(fdlg.szFullFile,
468 FIL_QUERYFULLNAME,
469 filename,
470 sizeof(filename))) {
471 if(!DosQueryPathInfo(filename,
472 FIL_STANDARD,
473 &fs3,
474 sizeof(fs3))) {
475 p = filename;
476 while(*p) {
477 if(*p == '/')
478 *p = '\\';
479 p++;
480 }
481 strcpy(cl->prompt,filename);
482 PostMsg(hwnd,
483 UM_UNDO,
484 MPVOID,
485 MPVOID);
486 }
487// else saymsg(MB_ENTER,hwnd,DEBUG_STRING,"DosQueryPathInfo FIL_STANDARD failed");
488 }
489// else saymsg(MB_ENTER,hwnd,DEBUG_STRING,"DosQueryPathInfo FIL_QUERYFULLNAME failed");
490 }
491// else saymsg(MB_ENTER,hwnd,DEBUG_STRING,"lReturn = %lu lSRC = %lu",fdlg.lReturn,fdlg.lSRC);
492 }
493// else saymsg(MB_ENTER,hwnd,DEBUG_STRING,"WinFileDlg failed");
494 }
495 }
496 }
497 break;
498
499 case DND_TARGETINFO:
500 cl = INSTDATA(hwnd);
501 if(cl) {
502
503 CHAR *list[2];
504
505 list[0] = cl->prompt;
506 list[1] = NULL;
507 WinDlgBox(HWND_DESKTOP,hwnd,FileInfoProc,FM3ModHandle,
508 FLE_FRAME,(PVOID)&list);
509 }
510 break;
511
512 case DND_EXTRACT:
513 case DND_LAUNCH:
514 case DND_COPY:
515 case DND_MOVE:
516 case DND_OBJECT:
517 case DND_COMPARE:
518 case DND_SETICON:
519 case DND_APPEND:
520 cl = INSTDATA(hwnd);
521 if(cl) {
522
523 SHORT x;
524 CHAR szBuffer[CCHMAXPATH + 1];
525 INT numfiles = 0,numalloc = 0,error;
526 USHORT cmd;
527
528 FreeList(cl->list);
529 cl->list = NULL;
530 x = (SHORT)WinSendDlgItemMsg(hwnd,DND_LISTBOX,LM_QUERYSELECTION,
531 MPFROMSHORT(LIT_FIRST),MPVOID);
532 if(x >= 0) {
533 do {
534 *szBuffer = 0;
535 WinSendDlgItemMsg(hwnd,DND_LISTBOX,LM_QUERYITEMTEXT,
536 MPFROM2SHORT(x,CCHMAXPATH),
537 MPFROMP(szBuffer));
538 if(*szBuffer) {
539 error = AddToList(szBuffer,&cl->list,&numfiles,&numalloc);
540 if(error) {
541 DosBeep(250,100);
542 break;
543 }
544 }
545 x = (SHORT)WinSendDlgItemMsg(hwnd,DND_LISTBOX,
546 LM_QUERYSELECTION,
547 MPFROMSHORT(x),MPVOID);
548 } while(x >= 0);
549 }
550 cmd = SHORT1FROMMP(mp1);
551 switch(cmd) {
552 case DND_COPY:
553 if(WinQueryButtonCheckstate(hwnd,DND_RENAME)) {
554 Wild = TRUE;
555 cmd = DND_WILDCOPY;
556 }
557 else
558 Wild = FALSE;
559 break;
560 case DND_MOVE:
561 if(WinQueryButtonCheckstate(hwnd,DND_RENAME)) {
562 Wild = TRUE;
563 cmd = DND_WILDMOVE;
564 }
565 else
566 Wild = FALSE;
567 break;
568 case DND_OBJECT:
569 if(WinQueryButtonCheckstate(hwnd,DND_SHADOW)) {
570 Shadow = TRUE;
571 cmd = DND_SHADOW;
572 }
573 else
574 Shadow = FALSE;
575 break;
576 }
577 WinDismissDlg(hwnd,cmd);
578 }
579 else
580 WinDismissDlg(hwnd,0);
581 break;
582
583 case DID_CANCEL:
584 WinDismissDlg(hwnd,0);
585 break;
586 }
587 return 0;
588 }
589 return WinDefDlgProc(hwnd,msg,mp1,mp2);
590}
591
Note: See TracBrowser for help on using the repository browser.