source: trunk/dll/assoc.c@ 552

Last change on this file since 552 was 552, checked in by Gregg Young, 19 years ago

font cleanup; new image and archiver masks; messages moved to string file; new drive flags including David's icons mostly working

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