source: trunk/dll/viewinf.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.7 KB
RevLine 
[2]1/* offset 107: title of INF file */
2
3#define INCL_DOS
4#define INCL_WIN
5
6#include <os2.h>
7#include <stdio.h>
8#include <stdlib.h>
9#include <string.h>
10#include <ctype.h>
11#include <share.h>
12#include "fm3dll.h"
13#include "fm3dlg.h"
14#include "fm3str.h"
15
16#pragma data_seg(DATA1)
17#pragma alloc_text(VIEWINFS,FillListbox,ViewInfProc)
18
19typedef struct {
20 USHORT size;
21 USHORT help;
22 HWND hwnd;
23} DUMMY;
24
25
26static VOID FillListbox (VOID *args) {
27
28 HWND hwnd;
29 DUMMY *dummy = (DUMMY *)args;
30 HAB hab2;
31 HMQ hmq2;
32 BOOL repeating = FALSE;
33
34 if(!dummy)
35 return;
36 hwnd = dummy->hwnd;
37 hab2 = WinInitialize(0);
38 if(hab2) {
39 hmq2 = WinCreateMsgQueue(hab2,0);
40 if(hmq2) {
41
42 CHAR *env,*p,*holdenv;
43
44 WinCancelShutdown(hmq2,TRUE);
45 priority_normal();
46 if(!dummy->help)
47 env = getenv("BOOKSHELF");
48 else
49 env = getenv("HELP");
50 if(!env) {
51 saymsg(MB_CANCEL,
52 hwnd,
53 GetPString(IDS_SYSERRORTEXT),
54 GetPString(IDS_ENVPATHERRORTEXT),
55 (dummy->help) ? "HELP" : "BOOKSHELF",
56 (dummy->help) ? ".HLP" : ".INF");
57 goto NoEnv;
58 }
59 else {
60 holdenv = malloc(strlen(env) + 2L);
61 if(!holdenv)
62 saymsg(MB_CANCEL,
63 hwnd,
64 GetPString(IDS_ERRORTEXT),
65 GetPString(IDS_OUTOFMEMORY));
66 else {
67 strcpy(holdenv,env);
68Repeat:
69 if(holdenv[strlen(holdenv) - 1] != ';')
70 strcat(holdenv,";");
71 p = strtok(holdenv,";");
72 while(p) {
73 lstrip(rstrip(p));
74 if(*p) {
75
76 CHAR mask[CCHMAXPATH],*enddir,text[CCHMAXPATH * 2];
77 FILEFINDBUF3 ffb;
78 HDIR hdir;
79 ULONG nm;
80
81 strcpy(mask,p);
82 if(mask[strlen(mask) - 1] != '\\')
83 strcat(mask,"\\");
84 enddir = mask + strlen(mask);
85 if(dummy->help)
86 strcat(mask,"*.HLP");
87 else
88 strcat(mask,"*.INF");
89 hdir = HDIR_CREATE;
90 nm = 1L;
91 DosError(FERR_DISABLEHARDERR);
92 if(!DosFindFirst(mask,&hdir,FILE_NORMAL | FILE_ARCHIVED,
93 &ffb,sizeof(ffb),&nm,FIL_STANDARD)) {
94 do {
95 priority_normal();
96 strcpy(enddir,ffb.achName);
97 {
98 FILE *fp;
99 CHAR title[CCHMAXPATH];
100
101 *title = 0;
102 fp = _fsopen(mask,"rb",SH_DENYNO);
103 if(fp) {
104 fread(title,1,3,fp);
105 if(*title != 'H' || title[1] != 'S' || title[2] != 'P') {
106 fclose(fp);
107 goto Continue;
108 }
109 *title = 0;
110 fseek(fp,107L,SEEK_SET);
111 fread(title,1,CCHMAXPATH - 2,fp);
112 title[CCHMAXPATH - 3] = 0;
113 lstrip(rstrip(title));
114 fclose(fp);
115 }
116 p = strchr(ffb.achName,'.');
117 if(p)
118 *p = 0;
119 sprintf(text,
120 "%-10.10s %-42.42s > %s",
121 ffb.achName,
122 title,
123 mask);
124 }
125 if(!WinIsWindow(hab2,hwnd))
126 break;
127 WinSendDlgItemMsg(hwnd,
128 VINF_LISTBOX,
129 LM_INSERTITEM,
130 MPFROM2SHORT(LIT_SORTASCENDING,0),
131 MPFROMP(text));
132Continue:
133 nm = 1L;
134 } while(!DosFindNext(hdir,&ffb,sizeof(ffb),&nm));
135 DosFindClose(hdir);
136 priority_normal();
137 }
138 }
139 if(!WinIsWindow(hab2,hwnd))
140 break;
141 p = strtok(NULL,";");
142 }
143 free(holdenv);
144NoEnv:
145 if(WinIsWindow(hab2,hwnd) && !repeating) {
146
147 ULONG size;
148 CHAR *key = "INFPaths";
149
150 if(dummy->help)
151 key = "HLPPaths";
152 repeating = TRUE;
153 if(PrfQueryProfileSize(fmprof,
154 FM3Str,
155 key,
156 &size) &&
157 size) {
158 holdenv = malloc(size + 2L);
159 if(holdenv) {
160 if(PrfQueryProfileData(fmprof,
161 FM3Str,
162 key,
163 holdenv,
164 &size))
165 goto Repeat;
166 else
167 free(holdenv);
168 }
169 }
170 }
171 }
172 }
173 WinDestroyMsgQueue(hmq2);
174 }
175 WinTerminate(hab2);
176 }
177 PostMsg(hwnd,UM_CONTAINER_FILLED,MPVOID,MPVOID);
178 free(dummy);
179}
180
181
182MRESULT EXPENTRY ViewInfProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2) {
183
184 static HWND hwndMe = (HWND)0;
185 static BOOL help = FALSE;
186 static BOOL threaddone = TRUE;
187 static LONG ypos = 0;
188 static HPOINTER hptrIcon = (HPOINTER)0;
189
190 switch(msg) {
191 case WM_INITDLG:
192 WinSendDlgItemMsg(hwnd,VINF_ENTRY,EM_SETTEXTLIMIT,
193 MPFROM2SHORT(1000,0),MPVOID);
194 WinSendDlgItemMsg(hwnd,VINF_TOPIC,EM_SETTEXTLIMIT,
195 MPFROM2SHORT(CCHMAXPATH * 2,0),MPVOID);
196 if(hwndMe) {
197 WinSetWindowPos(hwndMe,HWND_TOP,0,0,0,0,SWP_RESTORE | SWP_ZORDER |
198 SWP_ACTIVATE);
199 WinDismissDlg(hwnd,0);
200 break;
201 }
202 help = (mp2 != (MPARAM)0);
203 if(help) {
204
205 SWP swp;
206
207 WinQueryWindowPos(WinWindowFromID(hwnd,
208 VINF_LISTBOX),
209 &swp);
210 WinDestroyWindow(WinWindowFromID(hwnd,
211 VINF_LISTBOX));
212 WinCreateWindow(hwnd,
213 WC_LISTBOX,
214 (PSZ)NULL,
215 WS_VISIBLE | LS_HORZSCROLL,
216 swp.x,
217 swp.y,
218 swp.cx,
219 swp.cy,
220 hwnd,
221 HWND_TOP,
222 VINF_LISTBOX,
223 NULL,
224 NULL);
225 WinSetPresParam(WinWindowFromID(hwnd,
226 VINF_LISTBOX),
227 PP_FONTNAMESIZE,
228 strlen(GetPString(IDS_10SYSTEMMONOTEXT)) + 1,
229 (PVOID)GetPString(IDS_10SYSTEMMONOTEXT));
230 WinSetWindowText(hwnd,
231 GetPString(IDS_VIEWHELPFILESTEXT));
232 WinShowWindow(WinWindowFromID(hwnd,
233 VINF_SRCH),
234 FALSE);
235 WinShowWindow(WinWindowFromID(hwnd,
236 VINF_FILTER),
237 FALSE);
238 WinShowWindow(WinWindowFromID(hwnd,
239 VINF_TOPIC),
240 FALSE);
241 WinShowWindow(WinWindowFromID(hwnd,
242 VINF_TOPICHDR),
243 FALSE);
244 }
245 hptrIcon = WinLoadPointer(HWND_DESKTOP,
246 FM3ModHandle,
247 VINF_FRAME);
248 WinDefDlgProc(hwnd,
249 WM_SETICON,
250 MPFROMLONG(hptrIcon),
251 MPVOID);
252 hwndMe = hwnd;
253 PostMsg(hwnd,
254 UM_STRETCH,
255 MPVOID,
256 MPVOID);
257 PostMsg(hwnd,
258 UM_RESCAN,
259 MPVOID,
260 MPVOID);
261 break;
262
263 case UM_RESCAN:
264 WinSendDlgItemMsg(hwnd,
265 VINF_LISTBOX,
266 LM_DELETEALL,
267 MPVOID,
268 MPVOID);
269 {
270 DUMMY *d;
271
272 d = malloc(sizeof(DUMMY));
273 if(d) {
274 memset(d,0,sizeof(DUMMY));
275 d->size = sizeof(DUMMY);
276 d->hwnd = hwnd;
277 if(help)
278 d->help = 1;
279 if(_beginthread(FillListbox,NULL,65536,(PVOID)d) == -1) {
280 DosBeep(50,100);
281 free(d);
282 WinDismissDlg(hwnd,0);
283 return 0;
284 }
285 WinEnableWindow(WinWindowFromID(hwnd,DID_CANCEL),FALSE);
286 threaddone = FALSE;
287 }
288 else {
289 DosBeep(100,100);
290 WinDismissDlg(hwnd,0);
291 return 0;
292 }
293 }
294 return 0;
295
296 case UM_CONTAINER_FILLED:
297 if(!(SHORT)WinSendDlgItemMsg(hwnd,
298 VINF_LISTBOX,
299 LM_QUERYITEMCOUNT,
300 MPVOID,
301 MPVOID)) {
302 saymsg(MB_CANCEL,
303 hwnd,
304 GetPString(IDS_ERRORTEXT),
305 GetPString(IDS_NOFILESFOUNDTEXT));
306 hwndMe = (HWND)0;
307 WinDismissDlg(hwnd,0);
308 }
309 WinEnableWindow(WinWindowFromID(hwnd,DID_CANCEL),TRUE);
310 threaddone = TRUE;
311 return 0;
312
313 case WM_CONTROL:
314 switch(SHORT1FROMMP(mp1)) {
315 case VINF_LISTBOX:
316 switch(SHORT2FROMMP(mp1)) {
317 case LN_ENTER:
318 PostMsg(hwnd,
319 WM_COMMAND,
320 MPFROM2SHORT(DID_OK,0),
321 MPVOID);
322 break;
323 }
324 break;
325 case VINF_ENTRY:
326 switch(SHORT2FROMMP(mp1)) {
327 case EN_CHANGE:
328 {
329 SHORT sSelect;
330 CHAR szBuffer[CCHMAXPATH];
331
332 WinQueryDlgItemText(hwnd,
333 VINF_ENTRY,
334 CCHMAXPATH,
335 szBuffer);
336 lstrip(rstrip(szBuffer));
337 sSelect = (SHORT)WinSendDlgItemMsg(hwnd,
338 VINF_LISTBOX,
339 LM_SEARCHSTRING,
340 MPFROM2SHORT(LSS_SUBSTRING,
341 LIT_FIRST),
342 MPFROMP(szBuffer));
343 if(sSelect >= 0)
344 WinSendDlgItemMsg(hwnd,
345 VINF_LISTBOX,
346 LM_SETTOPINDEX,
347 MPFROM2SHORT(sSelect,0),
348 MPVOID);
349 }
350 break;
351 }
352 break;
353 }
354 return 0;
355
356 case WM_ADJUSTWINDOWPOS:
357 PostMsg(hwnd,UM_STRETCH,MPVOID,MPVOID);
358 break;
359
360 case UM_STRETCH:
361 {
362 SWP swpC,swp;
363
364 WinQueryWindowPos(hwnd,&swp);
365 if(!(swp.fl & (SWP_HIDE | SWP_MINIMIZE))) {
366 WinQueryWindowPos(WinWindowFromID(hwnd,VINF_LISTBOX),&swpC);
367 if(!ypos)
368 ypos = swpC.y;
369 WinSetWindowPos(WinWindowFromID(hwnd,VINF_LISTBOX),HWND_TOP,
370 SysVal(SV_CXSIZEBORDER),
371 ypos,
372 swp.cx - (SysVal(SV_CXSIZEBORDER) * 2),
373 (swp.cy - ypos) - (SysVal(SV_CYTITLEBAR) +
374 SysVal(SV_CYSIZEBORDER)),
375 SWP_MOVE | SWP_SIZE);
376 }
377 }
378 return 0;
379
380 case WM_COMMAND:
381 switch(SHORT1FROMMP(mp1)) {
382 case VINF_RESCAN:
383 PostMsg(hwnd,UM_RESCAN,MPVOID,MPVOID);
384 break;
385
386 case VINF_SRCH:
387 {
388 SHORT sSelect,sLast = LIT_FIRST;
389 CHAR szBuffer[CCHMAXPATH];
390
391 *szBuffer = 0;
392 WinQueryDlgItemText(hwnd,
393 VINF_ENTRY,
394 CCHMAXPATH,
395 szBuffer);
396 rstrip(szBuffer);
397 if(!*szBuffer) {
398 sLast = (SHORT)WinSendDlgItemMsg(hwnd,
399 VINF_LISTBOX,
400 LM_QUERYITEMCOUNT,
401 MPVOID,
402 MPVOID);
403 for(sSelect = 0;sSelect < sLast;sSelect++)
404 WinSendDlgItemMsg(hwnd,
405 VINF_LISTBOX,
406 LM_SELECTITEM,
407 MPFROM2SHORT(sSelect,0),
408 MPFROM2SHORT(FALSE,0));
409 break;
410 }
411 for(;;) {
412 sSelect = (SHORT)WinSendDlgItemMsg(hwnd,VINF_LISTBOX,
413 LM_SEARCHSTRING,
414 MPFROM2SHORT(LSS_SUBSTRING,
415 sLast),
416 MPFROMP(szBuffer));
417 if(sSelect <= sLast)
418 break;
419 if(sSelect >= 0)
420 WinSendDlgItemMsg(hwnd,
421 VINF_LISTBOX,
422 LM_SELECTITEM,
423 MPFROM2SHORT(sSelect,0),
424 MPFROM2SHORT(TRUE,0));
425 else
426 break;
427 sLast = sSelect;
428 }
429 }
430 break;
431
432 case VINF_FILTER:
433 {
434 SHORT sSelect,sTotal;
435
436 sTotal = (SHORT)WinSendDlgItemMsg(hwnd,
437 VINF_LISTBOX,
438 LM_QUERYITEMCOUNT,
439 MPVOID,
440 MPVOID);
441 sSelect = (SHORT)WinSendDlgItemMsg(hwnd,
442 VINF_LISTBOX,
443 LM_QUERYSELECTION,
444 MPFROM2SHORT(LIT_FIRST,0),
445 MPVOID);
446 if(sSelect == LIT_NONE) {
447 DosBeep(50,100);
448 break;
449 }
450#ifdef BUGFIXED
451 sSelect = 0;
452 while(sSelect < sTotal) {
453 if(!WinSendDlgItemMsg(hwnd,
454 VINF_LISTBOX,
455 LM_SELECTITEM,
456 MPFROM2SHORT(sSelect,0),
457 MPFROM2SHORT(FALSE,0))) {
458 WinSendDlgItemMsg(hwnd,
459 VINF_LISTBOX,
460 LM_DELETEITEM,
461 MPFROM2SHORT(sSelect,0),
462 MPVOID);
463 sTotal--;
464 }
465 else
466 sSelect++;
467 }
468#else
469 for(sSelect = 0;sSelect < sTotal;sSelect++)
470 WinSendDlgItemMsg(hwnd,
471 VINF_LISTBOX,
472 LM_SETITEMHANDLE,
473 MPFROM2SHORT(sSelect,0),
474 MPVOID);
475 sSelect = LIT_FIRST;
476 for(;;) {
477 sSelect = (SHORT)WinSendDlgItemMsg(hwnd,
478 VINF_LISTBOX,
479 LM_QUERYSELECTION,
480 MPFROM2SHORT(sSelect,0),
481 MPVOID);
482 if(sSelect >= 0)
483 WinSendDlgItemMsg(hwnd,
484 VINF_LISTBOX,
485 LM_SETITEMHANDLE,
486 MPFROM2SHORT(sSelect,0),
487 MPFROMLONG(1L));
488 else
489 break;
490 }
491 for(sSelect = 0;sSelect < sTotal;sSelect++)
492 WinSendDlgItemMsg(hwnd,
493 VINF_LISTBOX,
494 LM_SELECTITEM,
495 MPFROM2SHORT(sSelect,0),
496 MPFROM2SHORT(FALSE,0));
497 sSelect = 0;
498 while(sSelect < sTotal) {
499 if(!WinSendDlgItemMsg(hwnd,
500 VINF_LISTBOX,
501 LM_QUERYITEMHANDLE,
502 MPFROM2SHORT(sSelect,0),
503 MPVOID)) {
504 WinSendDlgItemMsg(hwnd,
505 VINF_LISTBOX,
506 LM_DELETEITEM,
507 MPFROM2SHORT(sSelect,0),
508 MPVOID);
509 sTotal--;
510 }
511 else
512 sSelect++;
513 }
514#endif
515 }
516 break;
517
518 case VINF_DIRS:
519 {
520 CHAR szBuffer[1001],*key = "INFPaths";
521
522 if(help)
523 key = "HLPPaths";
524 *szBuffer = 0;
525 WinQueryDlgItemText(hwnd,
526 VINF_ENTRY,
527 1000,
528 szBuffer);
529 lstrip(rstrip(szBuffer));
530 PrfWriteProfileData(fmprof,
531 FM3Str,
532 key,
533 (*szBuffer) ? szBuffer : NULL,
534 strlen(szBuffer));
535 PostMsg(hwnd,
536 UM_RESCAN,
537 MPVOID,
538 MPVOID);
539 }
540 break;
541
542 case DID_CANCEL:
543 hwndMe = (HWND)0;
544 WinDismissDlg(hwnd,0);
545 break;
546
547 case DID_OK:
548 {
549 SHORT sSelect;
550 CHAR text[CCHMAXPATH * 2],filename[CCHMAXPATH],*p;
551 FILE *fp;
552 BOOL notfirst = FALSE;
553
554 sSelect = (SHORT)WinSendDlgItemMsg(hwnd,
555 VINF_LISTBOX,
556 LM_QUERYSELECTION,
557 MPFROM2SHORT(LIT_FIRST,0),
558 MPVOID);
559 if(sSelect >= 0) {
560 if(help) {
561 *text = 0;
562 WinSendDlgItemMsg(hwnd,
563 VINF_LISTBOX,
564 LM_QUERYITEMTEXT,
565 MPFROM2SHORT(sSelect,CCHMAXPATH),
566 MPFROMP(text));
567 p = strchr(text,'>');
568 if(!p)
569 break;
570 p++;
571 lstrip(rstrip(p));
572 if(*p)
573 ViewHelp(p);
574 else
575 DosBeep(250,100);
576 break;
577 }
578 save_dir2(filename);
579 if(filename[strlen(filename) - 1] != '\\')
580 strcat(filename,"\\");
581 strcat(filename,"FM2VINF.CMD");
582 fp = fopen(filename,"w");
583 if(fp) {
584 fprintf(fp,"@ECHO OFF\nSET FM2REF=");
585 while(sSelect >= 0) {
586 *text = 0;
587 WinSendDlgItemMsg(hwnd,
588 VINF_LISTBOX,
589 LM_QUERYITEMTEXT,
590 MPFROM2SHORT(sSelect,
591 CCHMAXPATH),
592 MPFROMP(text));
593 p = strchr(text,'>');
594 if(p) {
595 p++;
596 lstrip(rstrip(p));
597 if(*p) {
598 if(notfirst)
599 fprintf(fp,"+");
600 notfirst = TRUE;
601 fprintf(fp,"%s",p);
602 }
603 }
604 sSelect = (SHORT)WinSendDlgItemMsg(hwnd,
605 VINF_LISTBOX,
606 LM_QUERYSELECTION,
607 MPFROM2SHORT(sSelect,0),
608 MPVOID);
609 }
610 *text = 0;
611 WinQueryDlgItemText(hwnd,
612 VINF_TOPIC,
613 CCHMAXPATH * 2,
614 text);
615 lstrip(rstrip(text));
616 fprintf(fp,
617 "\nVIEW FM2REF%s%s\nDEL %s\n",
618 (*text) ? " " : NullStr,
619 text,
620 filename);
621 fclose(fp);
622 runemf2(SEPARATE | WINDOWED | MINIMIZED |
623 BACKGROUND | INVISIBLE,
624 hwnd,
625 NULL,
626 NULL,
627 "%s /C %s",
628 GetCmdSpec(FALSE),
629 filename);
630 }
631 }
632 }
633 break;
634
635 case IDM_HELP:
636 if(hwndHelp) {
637 if(help)
638 WinSendMsg(hwndHelp,
639 HM_DISPLAY_HELP,
640 MPFROM2SHORT(HELP_VIEWHELPS,0),
641 MPFROMSHORT(HM_RESOURCEID));
642 else
643 WinSendMsg(hwndHelp,
644 HM_DISPLAY_HELP,
645 MPFROM2SHORT(HELP_VIEWINF,0),
646 MPFROMSHORT(HM_RESOURCEID));
647 }
648 break;
649 }
650 return 0;
651
652 case WM_CLOSE:
653 if(!threaddone)
654 return 0;
655 break;
656
657 case WM_DESTROY:
658 if(hwndMe == hwnd) {
659 hwndMe = (HWND)0;
660 if(hptrIcon)
661 WinDestroyPointer(hptrIcon);
662 hptrIcon = (HPOINTER)0;
663 }
664 break;
665 }
666 return WinDefDlgProc(hwnd,msg,mp1,mp2);
667}
Note: See TracBrowser for help on using the repository browser.