source: trunk/dll/assoc.c@ 506

Last change on this file since 506 was 506, checked in by root, 19 years ago

Add Move to last, Okay adds if new, Replace Current in Listbox Dialog

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 32.1 KB
Line 
1
2/**************************************************************************************
3
4 $Id: assoc.c 506 2006-09-25 01:03:53Z root $
5
6 Copyright (c) 1993-98 M. Kimes
7 Copyright (c) 2004, 2006 Steven H.Levine
8
9 01 Aug 04 SHL Rework lstrip/rstrip usage
10 14 Jul 06 SHL Use Runtime_Error
11 29 Jul 06 SHL Use xfgets, xfgets_bstripcr
12 10 Sep 06 GKY Add Move to last, Okay adds if new, Replace Current in Listbox Dialog
13
14**************************************************************************************/
15
16#define INCL_DOS
17#define INCL_WIN
18#define INCL_PM
19#define INCL_WINHOOKS
20
21#include <os2.h>
22#include <stdio.h>
23#include <stdlib.h>
24#include <string.h>
25#include <ctype.h>
26#include <share.h>
27#include "fm3dll.h"
28#include "fm3dlg.h"
29#include "fm3str.h"
30
31#pragma data_seg(DATA1)
32
33typedef struct {
34 CHAR mask[CCHMAXPATH];
35 CHAR cl[1001];
36 CHAR sig[CCHMAXPATH];
37 LONG offset;
38 ULONG flags;
39} ASSOC;
40
41typedef struct LINKASSOC {
42 CHAR *mask;
43 CHAR *cl;
44 CHAR *sig;
45 LONG offset;
46 ULONG flags;
47 struct LINKASSOC *prev;
48 struct LINKASSOC *next;
49} LINKASSOC;
50
51
52static LINKASSOC *asshead = NULL,*asstail = NULL;
53static BOOL assloaded = FALSE;
54
55static PSZ pszSrcFile = __FILE__;
56
57#pragma alloc_text(ASSOC2,free_commands,load_associations,save_associations)
58#pragma alloc_text(ASSOC2,ExecAssociation,AssocTextProc)
59
60MRESULT EXPENTRY AssocTextProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)
61{
62 PFNWP oldproc = (PFNWP)WinQueryWindowPtr(hwnd,QWL_USER);
63 static BOOL emphasized = FALSE;
64
65 switch(msg) {
66 case DM_DRAGOVER:
67 if(!emphasized) {
68 emphasized = TRUE;
69 DrawTargetEmphasis(hwnd,emphasized);
70 }
71 if(AcceptOneDrop(mp1,mp2))
72 return MRFROM2SHORT(DOR_DROP,
73 DO_MOVE);
74 return MRFROM2SHORT(DOR_NEVERDROP,0);
75
76 case DM_DRAGLEAVE:
77 if(emphasized) {
78 emphasized = FALSE;
79 DrawTargetEmphasis(hwnd,emphasized);
80 }
81 break;
82
83 case DM_DROPHELP:
84 DropHelp(mp1,mp2,hwnd,GetPString(IDS_ASSOCDROPHELPTEXT));
85 return 0;
86
87 case DM_DROP:
88 {
89 char szFrom[CCHMAXPATH + 5];
90
91 if(emphasized) {
92 emphasized = FALSE;
93 DrawTargetEmphasis(hwnd,emphasized);
94 }
95 if(GetOneDrop(mp1,mp2,szFrom,CCHMAXPATH)) {
96 strcat(szFrom," %a");
97 WinSetWindowText(hwnd,szFrom);
98 }
99 }
100 return 0;
101 }
102 return (oldproc) ? oldproc(hwnd,msg,mp1,mp2) :
103 WinDefWindowProc(hwnd,msg,mp1,mp2);
104}
105
106
107VOID free_associations (VOID)
108{
109 LINKASSOC *info,*next;
110
111 info = asshead;
112 while(info) {
113 next = info->next;
114 free(info->mask);
115 free(info->cl);
116 if(info->sig)
117 free(info->sig);
118 free(info);
119 info = next;
120 }
121 asshead = asstail = NULL;
122}
123
124
125VOID load_associations (VOID)
126{
127 FILE *fp;
128 LINKASSOC *info;
129 CHAR cl[1024];
130 CHAR mask[CCHMAXPATH + 24];
131 CHAR sig[CCHMAXPATH + 24];
132 CHAR offset[72];
133 CHAR flags[72];
134
135 if(asshead)
136 free_associations();
137 assloaded = TRUE;
138 save_dir2(mask);
139 if(mask[strlen(mask) - 1] != '\\')
140 strcat(mask,"\\");
141 strcat(mask,"ASSOC.DAT");
142 fp = _fsopen(mask,"r",SH_DENYWR);
143 if (fp) {
144 while(!feof(fp)) {
145 if (!xfgets(mask,sizeof(mask),fp,pszSrcFile,__LINE__)) // fixme why +24?
146 break;
147 mask[CCHMAXPATH] = 0;
148 bstripcr(mask);
149 if(!*mask || *mask == ';')
150 continue;
151 if(!xfgets(cl,sizeof(cl),fp,pszSrcFile,__LINE__) ||
152 !xfgets(sig,CCHMAXPATH + 24,fp,pszSrcFile,__LINE__) ||
153 !xfgets(offset,sizeof(offset),fp,pszSrcFile,__LINE__) ||
154 !xfgets(flags,sizeof(flags),fp,pszSrcFile,__LINE__))
155 break; /* error! */
156 cl[1000] = 0;
157 bstripcr(cl);
158 sig[CCHMAXPATH] = 0;
159 bstripcr(sig);
160 offset[34] = 0;
161 bstripcr(offset);
162 flags[34] = 0;
163 bstripcr(flags);
164 if (!*cl)
165 continue;
166 info = xmallocz(sizeof(LINKASSOC),pszSrcFile,__LINE__);
167 if (info) {
168 info->cl = xstrdup(cl,pszSrcFile,__LINE__);
169 info->mask = xstrdup(mask,pszSrcFile,__LINE__);
170 if(*sig)
171 info->sig = xstrdup(sig,pszSrcFile,__LINE__);
172 info->offset = atol(offset);
173 info->flags = atol(flags);
174 if (!info->cl || !info->mask) {
175 if (info->cl)
176 free(info->cl);
177 if (info->mask)
178 free(info->mask);
179 free (info);
180 break;
181 }
182 if(!asshead)
183 asshead = info;
184 else {
185 asstail->next = info;
186 info->prev = asstail;
187 }
188 asstail = info;
189 }
190 }
191 fclose(fp);
192 }
193}
194
195
196VOID save_associations (VOID)
197{
198 LINKASSOC *info;
199 FILE *fp;
200 CHAR s[CCHMAXPATH + 14];
201
202 if(!assloaded || !asshead)
203 return;
204 info = asshead;
205#ifdef NEVER
206 while(info) {
207 next = info->next;
208 if(!strcmp("*",info->mask)) {
209 if(info != asshead) { /* already top record */
210 if(info->prev)
211 (info->prev)->next = info->next;
212 if(info->next)
213 (info->next)->prev = info->prev;
214 if(info == asstail)
215 asstail = info->prev;
216 info->next = asshead->next;
217 info->prev = NULL;
218 asshead = info;
219 }
220 }
221 info = next;
222 }
223#endif
224 save_dir2(s);
225 if(s[strlen(s) - 1] != '\\')
226 strcat(s,"\\");
227 strcat(s,"ASSOC.DAT");
228 fp = xfopen(s,"w",pszSrcFile,__LINE__);
229 if (fp) {
230 fputs(GetPString(IDS_ASSOCFILETEXT),fp);
231 info = asshead;
232 while(info) {
233 fprintf(fp,
234 ";\n%0.*s\n%0.1000s\n%0.*s\n%lu\n%lu\n",
235 CCHMAXPATH,
236 info->mask,
237 info->cl,
238 CCHMAXPATH,
239 (info->sig) ? info->sig : NullStr,
240 info->offset,
241 info->flags);
242 info = info->next;
243 }
244 fclose(fp);
245 }
246}
247
248#pragma alloc_text(ASSOC,add_association,kill_association,AssocDlgProc,EditAssociations)
249
250
251LINKASSOC * add_association (ASSOC *addme)
252{
253 LINKASSOC *info;
254
255 if(addme && *addme->cl && *addme->mask) {
256 info = asshead;
257 while(info) {
258 if(!stricmp(info->mask,addme->mask) &&
259 ((!info->sig && !*addme->sig) ||
260 (info->sig && !strcmp(addme->sig,info->sig))))
261 return NULL;
262 info = info->next;
263 }
264 if(!info) {
265 info = xmallocz(sizeof(LINKASSOC),pszSrcFile,__LINE__);
266 if(info) {
267 info->cl = xstrdup(addme->cl,pszSrcFile,__LINE__);
268 info->mask = xstrdup(addme->mask,pszSrcFile,__LINE__);
269 if(*addme->sig)
270 info->sig = xstrdup(addme->sig,pszSrcFile,__LINE__);
271 if(addme->offset)
272 info->offset = addme->offset;
273 if(addme->flags)
274 info->flags = addme->flags;
275 if(!info->cl || !info->mask) {
276 if(info->cl)
277 free(info->cl);
278 if(info->mask)
279 free(info->mask);
280 free(info);
281 }
282 else {
283 if(!asshead) /* only item in list */
284 asshead = asstail = info;
285 else {
286 if(asstail) { /* place at tail */
287 asstail->next = info;
288 info->prev = asstail;
289 }
290 asstail = info;
291 }
292 return info;
293 }
294 }
295 }
296 }
297 return NULL;
298}
299
300
301BOOL kill_association (ASSOC *killme)
302{
303 LINKASSOC *info;
304
305 if(killme && *killme->mask) {
306 info = asshead;
307 while(info) {
308 if(!stricmp(info->mask,killme->mask) &&
309 info->offset == killme->offset &&
310 (((!info->sig || !*info->sig) && !*killme->sig) ||
311 (info->sig && !strcmp(killme->sig,info->sig)))) {
312 if(info == asshead) {
313 asshead = info->next;
314 if(info == asstail)
315 asstail = info->prev;
316 }
317 else {
318 if(info->next)
319 (info->next)->prev = info->prev;
320 if(info->prev)
321 (info->prev)->next = info->next;
322 if(info == asstail)
323 asstail = info->prev;
324 }
325 free(info->cl);
326 free(info->mask);
327 if(info->sig)
328 free(info->sig);
329 free(info);
330 return TRUE;
331 }
332 info = info->next;
333 }
334 }
335 return FALSE;
336}
337
338
339INT ExecAssociation (HWND hwnd, CHAR *datafile)
340{
341 CHAR *file,sig[CCHMAXPATH],sigl[CCHMAXPATH],mask[CCHMAXPATH],*p;
342 FILE *fp;
343 BOOL didmatch,exclude;
344 ULONG offset;
345 LINKASSOC *info;
346
347 if(!assloaded)
348 load_associations();
349 if(!asshead)
350 return -1;
351 if(!datafile ||
352 !*datafile)
353 return -1;
354 file = strrchr(datafile,'\\');
355 if(!file)
356 file = strrchr(datafile,':');
357 if(file)
358 file++;
359 else
360 file = datafile;
361 info = asshead;
362 while(info) {
363 strcpy(mask,
364 info->mask);
365 p = strtok(mask,";");
366 while(p) {
367 if(*p == '/') {
368 p++;
369 exclude = TRUE;
370 }
371 else
372 exclude = FALSE;
373 didmatch = wildcard((strchr(p,'\\') ||
374 strchr(p,':')) ?
375 datafile :
376 file,
377 p,
378 FALSE);
379 if(exclude &&
380 didmatch)
381 didmatch = FALSE;
382 if(didmatch) {
383 if(info->sig &&
384 *info->sig) {
385 strcpy(sigl,
386 info->sig);
387 literal(sigl);
388 fp = _fsopen(datafile,"rb",SH_DENYNO);
389 if (fp) {
390 if(info->offset < 0L) {
391 fseek(fp,
392 0L,
393 SEEK_END);
394 offset = ftell(fp) + info->offset;
395 }
396 else
397 offset = info->offset;
398 fseek(fp,
399 offset,
400 SEEK_SET);
401 if(fread(sig,
402 1,
403 strlen(sigl),
404 fp) !=
405 strlen(sigl) ||
406 strncmp(sigl,
407 sig,
408 strlen(sigl)))
409 didmatch = FALSE;
410 fclose(fp);
411 }
412 }
413 }
414 if(didmatch) { /* got a match; do it... */
415
416 CHAR *list[2];
417 INT flags,rc;
418 BOOL dieafter = FALSE;
419
420 if(fAmAV2) {
421 if(stristr(info->cl,"AV2.EXE") ||
422 stristr(info->cl,"AV2.CMD") ||
423 stristr(info->cl,"<>"))
424 return -1;
425 }
426 if(!strcmp(info->cl,"<>")) {
427 OpenObject(datafile,
428 Default,
429 hwnd);
430 return 0;
431 }
432 list[0] = datafile;
433 list[1] = NULL;
434 flags = info->flags;
435 if(!(flags & FULLSCREEN))
436 flags |= WINDOWED;
437 if(flags & KEEP)
438 flags |= SEPARATEKEEP;
439 else
440 flags |= SEPARATE;
441 flags &= (~KEEP);
442 if(flags & DIEAFTER)
443 dieafter = TRUE;
444 flags &= (~DIEAFTER);
445 rc = ExecOnList(hwnd,
446 info->cl,
447 flags,
448 NULL,
449 list,
450 GetPString(IDS_EXECASSOCTITLETEXT));
451 if(rc != -1 &&
452 dieafter)
453 PostMsg((HWND)0,
454 WM_QUIT,
455 MPVOID,
456 MPVOID);
457 return rc;
458 }
459 p = strtok(0,";");
460 }
461 info = info->next;
462 }
463 return -1;
464}
465
466
467MRESULT EXPENTRY AssocDlgProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)
468{
469 LINKASSOC *info;
470 SHORT x , y;
471
472 switch(msg) {
473 case WM_INITDLG:
474 WinSendDlgItemMsg(hwnd,ASS_LISTBOX,LM_DELETEALL,MPVOID,MPVOID);
475 WinSendDlgItemMsg(hwnd,ASS_MASK,EM_SETTEXTLIMIT,
476 MPFROM2SHORT(CCHMAXPATH,0),MPVOID);
477 WinSendDlgItemMsg(hwnd,ASS_CL,EM_SETTEXTLIMIT,
478 MPFROM2SHORT(1000,0),MPVOID);
479 WinSendDlgItemMsg(hwnd,ASS_SIG,EM_SETTEXTLIMIT,
480 MPFROM2SHORT(CCHMAXPATH,0),MPVOID);
481 WinSendDlgItemMsg(hwnd,ASS_OFFSET,EM_SETTEXTLIMIT,
482 MPFROM2SHORT(34,0),MPVOID);
483 WinSetDlgItemText(hwnd,ASS_MASK,NullStr);
484 WinSetDlgItemText(hwnd,ASS_CL,NullStr);
485 WinSetDlgItemText(hwnd,ASS_SIG,NullStr);
486 WinSetDlgItemText(hwnd,ASS_OFFSET,"0");
487 WinCheckButton(hwnd,ASS_DEFAULT,TRUE);
488 WinCheckButton(hwnd,ASS_PROMPT,FALSE);
489 WinCheckButton(hwnd,ASS_KEEP,FALSE);
490 WinCheckButton(hwnd,ASS_DIEAFTER,FALSE);
491 PostMsg(hwnd,UM_UNDO,MPVOID,MPVOID);
492 {
493 PFNWP oldproc;
494
495 oldproc = WinSubclassWindow(WinWindowFromID(hwnd,ASS_CL),
496 (PFNWP)AssocTextProc);
497 if(oldproc)
498 WinSetWindowPtr(WinWindowFromID(hwnd,ASS_CL),QWL_USER,(PVOID)oldproc);
499 }
500 break;
501
502 case UM_UNDO:
503 {
504 CHAR s[1002 + CCHMAXPATH + 6];
505
506 WinSendDlgItemMsg(hwnd,
507 ASS_LISTBOX,
508 LM_DELETEALL,
509 MPVOID,
510 MPVOID);
511 info = asshead;
512 while(info) {
513 sprintf(s,
514 "%-12s \x1a %-24s %s%s%s",
515 info->mask,
516 info->cl,
517 (info->sig && *info->sig) ?
518 "[" : NullStr,
519 (info->sig && *info->sig) ? info->sig : NullStr,
520 (info->sig && *info->sig) ? "]" : NullStr);
521 x = (SHORT)WinSendDlgItemMsg(hwnd,
522 ASS_LISTBOX,
523 LM_INSERTITEM,
524 MPFROM2SHORT(LIT_END,0),
525 MPFROMP(s));
526 if(x >= 0)
527 WinSendDlgItemMsg(hwnd,
528 ASS_LISTBOX,
529 LM_SETITEMHANDLE,
530 MPFROMSHORT(x),
531 MPFROMP(info));
532 info = info->next;
533 }
534 WinSendDlgItemMsg(hwnd,
535 ASS_LISTBOX,
536 LM_SELECTITEM,
537 MPFROMSHORT(0),
538 MPFROMSHORT(TRUE));
539 }
540 return 0;
541
542 case WM_CONTROL:
543 if(SHORT1FROMMP(mp1) == ASS_LISTBOX) {
544 switch(SHORT2FROMMP(mp1)) {
545 case LN_ENTER:
546 case LN_SELECT:
547 x = (SHORT)WinSendDlgItemMsg(hwnd,
548 ASS_LISTBOX,
549 LM_QUERYSELECTION,
550 MPFROMSHORT(LIT_FIRST),
551 MPVOID);
552 if(x >= 0) {
553
554 CHAR s[36];
555
556 info = (LINKASSOC *)WinSendDlgItemMsg(hwnd,
557 ASS_LISTBOX,
558 LM_QUERYITEMHANDLE,
559 MPFROMSHORT(x),
560 MPVOID);
561 if(!info) {
562 Runtime_Error(pszSrcFile, __LINE__, "Query item handle failed");
563 break;
564 }
565 WinSetDlgItemText(hwnd,ASS_MASK,info->mask);
566 WinSetDlgItemText(hwnd,ASS_CL,info->cl);
567 WinSetDlgItemText(hwnd,ASS_SIG,
568 (info->sig && *info->sig) ? info->sig : NullStr);
569 sprintf(s,"%ld",info->offset);
570 WinSetDlgItemText(hwnd,ASS_OFFSET,s);
571 if(!(info->flags & 1023))
572 WinCheckButton(hwnd,ASS_DEFAULT,TRUE);
573 else {
574 if(info->flags & FULLSCREEN)
575 WinCheckButton(hwnd,ASS_FULLSCREEN,TRUE);
576 else if(info->flags & MINIMIZED)
577 WinCheckButton(hwnd,ASS_MINIMIZED,TRUE);
578 else if(info->flags & MAXIMIZED)
579 WinCheckButton(hwnd,ASS_MAXIMIZED,TRUE);
580 else if(info->flags & INVISIBLE)
581 WinCheckButton(hwnd,ASS_INVISIBLE,TRUE);
582 }
583 WinCheckButton(hwnd,ASS_KEEP,((info->flags & KEEP) != 0));
584 WinCheckButton(hwnd,ASS_DIEAFTER,((info->flags & DIEAFTER) != 0));
585 WinCheckButton(hwnd,ASS_PROMPT,((info->flags & PROMPT) != 0));
586 {
587 CHAR env[1002];
588 ULONG size;
589
590 *env = 0;
591 size = sizeof(env) - 1;
592 if(PrfQueryProfileData(fmprof,
593 FM3Str,
594 info->cl,
595 env,
596 &size) &&
597 *env)
598 WinSetDlgItemText(hwnd,
599 ASS_ENVIRON,
600 env);
601 else
602 WinSetDlgItemText(hwnd,
603 ASS_ENVIRON,
604 NullStr);
605 }
606 }
607 break;
608 }
609 }
610 return 0;
611
612 case WM_COMMAND:
613 switch(SHORT1FROMMP(mp1)) {
614 case ASS_TOP:
615 x = (SHORT)WinSendDlgItemMsg(hwnd,ASS_LISTBOX,
616 LM_QUERYSELECTION,
617 MPFROMSHORT(LIT_FIRST),
618 MPVOID);
619 if(x >= 0) {
620 info = (LINKASSOC *)WinSendDlgItemMsg(hwnd,ASS_LISTBOX,
621 LM_QUERYITEMHANDLE,
622 MPFROMSHORT(x),
623 MPVOID);
624 if(info) {
625 if(info != asshead) {
626 if(info->prev)
627 info->prev->next = info->next;
628 if(info->next)
629 info->next->prev = info->prev;
630 if(info == asstail)
631 asstail = info->prev;
632 info->prev = NULL;
633 info->next = asshead;
634 asshead->prev = info;
635 asshead = info;
636 WinSendMsg(hwnd,UM_UNDO,MPVOID,MPVOID);
637 }
638 }
639 }
640 break;
641
642 case ASS_BOTTOM:
643 x = (SHORT)WinSendDlgItemMsg(hwnd,ASS_LISTBOX,
644 LM_QUERYSELECTION,
645 MPFROMSHORT(LIT_FIRST),
646 MPVOID);
647 if(x >= 0) {
648 info = (LINKASSOC *)WinSendDlgItemMsg(hwnd,ASS_LISTBOX,
649 LM_QUERYITEMHANDLE,
650 MPFROMSHORT(x),
651 MPVOID);
652 if(info) {
653 if(info != asstail) {
654 if(info->next)
655 info->next->prev = info->prev;
656 if(info->prev)
657 info->prev->next = info->next;
658 if(info == asshead)
659 asshead = info->next;
660 info->next = NULL;
661 info->prev = asstail;
662 asstail->next = info;
663 asstail = info;
664 WinSendMsg(hwnd,UM_UNDO,MPVOID,MPVOID);
665 }
666 }
667 }
668 break;
669 case ASS_FIND:
670 {
671 CHAR filename[CCHMAXPATH + 9];
672
673 *filename = 0;
674 if(insert_filename(hwnd,filename,2,FALSE) && *filename) {
675 strcat(filename," %a");
676 WinSetDlgItemText(hwnd,ASS_CL,filename);
677 }
678 }
679 break;
680
681 case DID_OK:
682 {
683 ASSOC temp;
684 CHAR dummy[34];{
685 x = (SHORT)WinSendDlgItemMsg(hwnd,
686 ASS_LISTBOX,
687 LM_QUERYSELECTION,
688 MPVOID,
689 MPVOID);
690 if(x==LIT_NONE)
691 x = (SHORT) WinSendDlgItemMsg(hwnd,
692 ASS_LISTBOX,
693 LM_SELECTITEM,
694 MPFROMSHORT(0),
695 MPFROMSHORT(TRUE));
696 }
697 memset(&temp,0,sizeof(ASSOC));
698 WinQueryDlgItemText(hwnd,ASS_MASK,sizeof(temp.mask),temp.mask);
699 WinQueryDlgItemText(hwnd,ASS_CL,sizeof(temp.cl),temp.cl);
700 WinQueryDlgItemText(hwnd,ASS_SIG,sizeof(temp.sig),temp.sig);
701 rstrip(temp.sig);
702 if(*temp.sig) {
703 WinQueryDlgItemText(hwnd,ASS_OFFSET,sizeof(dummy),dummy);
704 temp.offset = atol(dummy);
705 }
706 bstrip(temp.mask);
707 bstrip(temp.cl);
708 if(WinQueryButtonCheckstate(hwnd,ASS_DEFAULT))
709 temp.flags = 0;
710 else if(WinQueryButtonCheckstate(hwnd,ASS_FULLSCREEN))
711 temp.flags = FULLSCREEN;
712 else if(WinQueryButtonCheckstate(hwnd,ASS_MINIMIZED))
713 temp.flags = MINIMIZED;
714 else if(WinQueryButtonCheckstate(hwnd,ASS_MAXIMIZED))
715 temp.flags = MAXIMIZED;
716 else if(WinQueryButtonCheckstate(hwnd,ASS_INVISIBLE))
717 temp.flags = INVISIBLE;
718 if(WinQueryButtonCheckstate(hwnd,ASS_KEEP))
719 temp.flags |= KEEP;
720 if(WinQueryButtonCheckstate(hwnd,ASS_DIEAFTER))
721 temp.flags |= DIEAFTER;
722 if(WinQueryButtonCheckstate(hwnd,ASS_PROMPT))
723 temp.flags |= PROMPT;
724 info = add_association(&temp);
725 if(!info)
726 WinDismissDlg(hwnd,1);/* Runtime_Error(pszSrcFile, __LINE__, "add_association");*/
727 else {
728
729 CHAR s[1002 + CCHMAXPATH + 6];
730
731 *s = 0;
732 WinQueryDlgItemText(hwnd,ASS_ENVIRON,1000,s);
733 bstripcr(s);
734 if(*s)
735 PrfWriteProfileString(fmprof,FM3Str,temp.cl,s);
736 sprintf(s,"%-12s \x1a %-24s %s%s%s",temp.mask,
737 temp.cl,(*temp.sig) ?
738 "[" : NullStr,(*temp.sig) ? temp.sig : NullStr,
739 (*temp.sig) ? "]" : NullStr);
740 x = (SHORT)WinSendDlgItemMsg(hwnd,
741 ASS_LISTBOX,
742 LM_INSERTITEM,
743 MPFROM2SHORT(LIT_END,0),
744 MPFROMP(s));
745 if(x >= 0) {
746 WinSendDlgItemMsg(hwnd,
747 ASS_LISTBOX,
748 LM_SETITEMHANDLE,
749 MPFROMSHORT(x),
750 MPFROMP(info));
751 WinSendDlgItemMsg(hwnd,
752 ASS_LISTBOX,
753 LM_SELECTITEM,
754 MPFROMSHORT(x),
755 MPFROMSHORT(TRUE));
756 }
757 save_associations();
758 }
759 }
760 WinDismissDlg(hwnd,1);
761 break;
762
763 case DID_CANCEL:
764 WinDismissDlg(hwnd,0);
765 break;
766
767 case IDM_HELP:
768 if(hwndHelp)
769 WinSendMsg(hwndHelp,HM_DISPLAY_HELP,
770 MPFROM2SHORT(HELP_ASSOC,0),
771 MPFROMSHORT(HM_RESOURCEID));
772 break;
773
774 case ASS_ADD:
775 {
776 ASSOC temp;
777 CHAR dummy[34];
778
779 memset(&temp,0,sizeof(ASSOC));
780 WinQueryDlgItemText(hwnd,ASS_MASK,sizeof(temp.mask),temp.mask);
781 WinQueryDlgItemText(hwnd,ASS_CL,sizeof(temp.cl),temp.cl);
782 WinQueryDlgItemText(hwnd,ASS_SIG,sizeof(temp.sig),temp.sig);
783 rstrip(temp.sig);
784 if(*temp.sig) {
785 WinQueryDlgItemText(hwnd,ASS_OFFSET,sizeof(dummy),dummy);
786 temp.offset = atol(dummy);
787 }
788 bstrip(temp.mask);
789 bstrip(temp.cl);
790 if(WinQueryButtonCheckstate(hwnd,ASS_DEFAULT))
791 temp.flags = 0;
792 else if(WinQueryButtonCheckstate(hwnd,ASS_FULLSCREEN))
793 temp.flags = FULLSCREEN;
794 else if(WinQueryButtonCheckstate(hwnd,ASS_MINIMIZED))
795 temp.flags = MINIMIZED;
796 else if(WinQueryButtonCheckstate(hwnd,ASS_MAXIMIZED))
797 temp.flags = MAXIMIZED;
798 else if(WinQueryButtonCheckstate(hwnd,ASS_INVISIBLE))
799 temp.flags = INVISIBLE;
800 if(WinQueryButtonCheckstate(hwnd,ASS_KEEP))
801 temp.flags |= KEEP;
802 if(WinQueryButtonCheckstate(hwnd,ASS_DIEAFTER))
803 temp.flags |= DIEAFTER;
804 if(WinQueryButtonCheckstate(hwnd,ASS_PROMPT))
805 temp.flags |= PROMPT;
806 info = add_association(&temp);
807 //Add will fail if mask is not changed
808 if(info)
809 {
810
811 CHAR s[1002 + CCHMAXPATH + 6];
812
813 *s = 0;
814 WinQueryDlgItemText(hwnd,ASS_ENVIRON,1000,s);
815 bstripcr(s);
816 if(*s)
817 PrfWriteProfileString(fmprof,FM3Str,temp.cl,s);
818 sprintf(s,"%-12s \x1a %-24s %s%s%s",temp.mask,
819 temp.cl,(*temp.sig) ?
820 "[" : NullStr,(*temp.sig) ? temp.sig : NullStr,
821 (*temp.sig) ? "]" : NullStr);
822 x = (SHORT)WinSendDlgItemMsg(hwnd,
823 ASS_LISTBOX,
824 LM_INSERTITEM,
825 MPFROM2SHORT(LIT_END,0),
826 MPFROMP(s));
827 if(x >= 0) {
828 WinSendDlgItemMsg(hwnd,
829 ASS_LISTBOX,
830 LM_SETITEMHANDLE,
831 MPFROMSHORT(x),
832 MPFROMP(info));
833 WinSendDlgItemMsg(hwnd,
834 ASS_LISTBOX,
835 LM_SELECTITEM,
836 MPFROMSHORT(x),
837 MPFROMSHORT(TRUE));
838 }
839 save_associations();
840 }
841 }
842 break;
843
844 case ASS_DELETE:
845 {
846 ASSOC temp;
847 CHAR dummy[34];
848
849 memset(&temp,0,sizeof(ASSOC));
850 WinQueryDlgItemText(hwnd,ASS_MASK,sizeof(temp.mask),temp.mask);
851 WinQueryDlgItemText(hwnd,ASS_SIG,sizeof(temp.sig),temp.sig);
852 rstrip(temp.sig);
853 if(*temp.sig) {
854 WinQueryDlgItemText(hwnd,ASS_OFFSET,sizeof(dummy),dummy);
855 temp.offset = atol(dummy);
856 }
857 bstrip(temp.mask);
858 PrfWriteProfileData(fmprof,
859 FM3Str,
860 temp.mask,
861 NULL,
862 0L);
863 if(!kill_association(&temp))
864 Runtime_Error(pszSrcFile, __LINE__, "kill_association");
865 else {
866 x = (SHORT)WinSendDlgItemMsg(hwnd,
867 ASS_LISTBOX,
868 LM_QUERYSELECTION,
869 MPFROMSHORT(LIT_FIRST),
870 MPVOID);
871 if(x >= 0) {
872 WinSendDlgItemMsg(hwnd,
873 ASS_LISTBOX,
874 LM_DELETEITEM,
875 MPFROMSHORT(x),
876 MPVOID);
877 WinSendDlgItemMsg(hwnd,ASS_LISTBOX,LM_SELECTITEM,
878 MPFROMSHORT(LIT_NONE),
879 MPFROMSHORT(FALSE));
880 }
881 save_associations();
882 }
883 }
884 break;
885 case ASS_REPLACE:
886
887
888
889 {
890 ASSOC temp;
891 CHAR dummy[34];
892
893 y = (SHORT)WinSendDlgItemMsg(hwnd,
894 ASS_LISTBOX,
895 LM_QUERYSELECTION,
896 MPFROMSHORT(LIT_CURSOR),
897 MPVOID);
898 memset(&temp,0,sizeof(ASSOC));
899 WinQueryDlgItemText(hwnd,ASS_MASK,sizeof(temp.mask),temp.mask);
900 WinQueryDlgItemText(hwnd,ASS_CL,sizeof(temp.cl),temp.cl);
901 WinQueryDlgItemText(hwnd,ASS_SIG,sizeof(temp.sig),temp.sig);
902 rstrip(temp.sig);
903 if(*temp.sig) {
904 WinQueryDlgItemText(hwnd,ASS_OFFSET,sizeof(dummy),dummy);
905 temp.offset = atol(dummy);
906 }
907 bstrip(temp.mask);
908 bstrip(temp.cl);
909 if(WinQueryButtonCheckstate(hwnd,ASS_DEFAULT))
910 temp.flags = 0;
911 else if(WinQueryButtonCheckstate(hwnd,ASS_FULLSCREEN))
912 temp.flags = FULLSCREEN;
913 else if(WinQueryButtonCheckstate(hwnd,ASS_MINIMIZED))
914 temp.flags = MINIMIZED;
915 else if(WinQueryButtonCheckstate(hwnd,ASS_MAXIMIZED))
916 temp.flags = MAXIMIZED;
917 else if(WinQueryButtonCheckstate(hwnd,ASS_INVISIBLE))
918 temp.flags = INVISIBLE;
919 if(WinQueryButtonCheckstate(hwnd,ASS_KEEP))
920 temp.flags |= KEEP;
921 if(WinQueryButtonCheckstate(hwnd,ASS_DIEAFTER))
922 temp.flags |= DIEAFTER;
923 if(WinQueryButtonCheckstate(hwnd,ASS_PROMPT))
924 temp.flags |= PROMPT;
925 info = add_association(&temp);
926 //Add will fail if mask is not changed
927 if(info)
928 {
929
930 CHAR s[1002 + CCHMAXPATH + 6];
931
932 *s = 0;
933 WinQueryDlgItemText(hwnd,ASS_ENVIRON,1000,s);
934 bstripcr(s);
935 if(*s)
936 PrfWriteProfileString(fmprof,FM3Str,temp.cl,s);
937 sprintf(s,"%-12s \x1a %-24s %s%s%s",temp.mask,
938 temp.cl,(*temp.sig) ?
939 "[" : NullStr,(*temp.sig) ? temp.sig : NullStr,
940 (*temp.sig) ? "]" : NullStr);
941 x = (SHORT)WinSendDlgItemMsg(hwnd,
942 ASS_LISTBOX,
943 LM_INSERTITEM,
944 MPFROM2SHORT(LIT_END,0),
945 MPFROMP(s));
946 if(x >= 0) {
947 WinSendDlgItemMsg(hwnd,
948 ASS_LISTBOX,
949 LM_SETITEMHANDLE,
950 MPFROMSHORT(x),
951 MPFROMP(info));
952 WinSendDlgItemMsg(hwnd,
953 ASS_LISTBOX,
954 LM_SELECTITEM,
955 MPFROMSHORT(x),
956 MPFROMSHORT(TRUE));
957 }
958 save_associations();
959 }
960 }
961 {
962 ASSOC temp;
963 CHAR dummy[34];
964
965 WinSendDlgItemMsg(hwnd,
966 ASS_LISTBOX,
967 LM_SELECTITEM,
968 MPFROMSHORT(y),
969 MPFROMSHORT(TRUE));
970 memset(&temp,0,sizeof(ASSOC));
971 WinQueryDlgItemText(hwnd,ASS_MASK,sizeof(temp.mask),temp.mask);
972 WinQueryDlgItemText(hwnd,ASS_SIG,sizeof(temp.sig),temp.sig);
973 rstrip(temp.sig);
974 if(*temp.sig) {
975 WinQueryDlgItemText(hwnd,ASS_OFFSET,sizeof(dummy),dummy);
976 temp.offset = atol(dummy);
977 }
978 bstrip(temp.mask);
979 PrfWriteProfileData(fmprof,
980 FM3Str,
981 temp.mask,
982 NULL,
983 0L);
984 if(!kill_association(&temp))
985 Runtime_Error(pszSrcFile, __LINE__, "kill_association");
986 else {
987
988 if(y >= 0) {
989 WinSendDlgItemMsg(hwnd,
990 ASS_LISTBOX,
991 LM_DELETEITEM,
992 MPFROMSHORT(y),
993 MPVOID);
994 WinSendDlgItemMsg(hwnd,ASS_LISTBOX,LM_SELECTITEM,
995 MPFROMSHORT(x-1),
996 MPFROMSHORT(TRUE));
997 }
998 save_associations();
999 }
1000 }
1001 break;
1002 }
1003 return 0;
1004 }
1005 return WinDefDlgProc(hwnd,msg,mp1,mp2);
1006}
1007
1008
1009VOID EditAssociations (HWND hwnd)
1010{
1011 static CHAR stop = 0;
1012
1013 if(stop)
1014 return;
1015 stop++;
1016 if(!assloaded)
1017 load_associations();
1018 WinDlgBox(HWND_DESKTOP,hwnd,AssocDlgProc,FM3ModHandle,ASS_FRAME,NULL);
1019 stop = 0;
1020}
Note: See TracBrowser for help on using the repository browser.