source: trunk/dll/assoc.c@ 529

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

Rework replace logic

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