source: trunk/dll/tools.c@ 1079

Last change on this file since 1079 was 1079, checked in by Steven Levine, 17 years ago

Avoid some more spurious leak reports

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 24.4 KB
Line 
1
2/***********************************************************************
3
4 $Id: tools.c 1079 2008-07-19 04:41:55Z stevenhl $
5
6 Toolbar support routines
7
8 Copyright (c) 1994-97 M. Kimes
9 Copyright (c) 2004, 2006 Steven H.Levine
10
11 01 Aug 04 SHL Rework lstrip/rstrip usage
12 23 May 05 SHL Use QWL_USER
13 22 Jul 06 SHL Check more run time errors
14 29 Jul 06 SHL Use xfgets, xfgets_bstripcr
15 18 Aug 06 SHL Report more runtime errors
16 05 Sep 06 SHL docopyf filename args must be variables
17 05 Sep 06 SHL Sync with standard source formatting
18 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
19 29 Feb 08 GKY Use xfree where appropriate
20
21***********************************************************************/
22
23#include <stdlib.h>
24#include <string.h>
25#include <share.h>
26
27#define INCL_DOS
28#define INCL_WIN
29#define INCL_LONGLONG
30
31#include "fm3dlg.h"
32#include "tools.h"
33#include "fm3str.h"
34#include "errutil.h" // Dos_Error...
35#include "strutil.h" // GetPString
36#include "fortify.h"
37#include "fm3dll.h"
38
39#pragma data_seg(DATA1)
40
41static PSZ pszSrcFile = __FILE__;
42
43TOOL *toolhead = NULL;
44
45//== load_quicktools() build *.tls array ==
46
47VOID load_quicktools(VOID)
48{
49 FILE *fp;
50 CHAR s[CCHMAXPATH + 14];
51 INT x;
52
53 qtloaded = TRUE;
54 for (x = 0; x < 50 && quicktool[x]; x++) {
55 free(quicktool[x]);
56 quicktool[x] = NULL;
57 }
58 if (!fToolbar) {
59 qtloaded = FALSE;
60 return;
61 }
62 save_dir2(s);
63 if (s[strlen(s) - 1] != '\\')
64 strcat(s, "\\");
65 strcat(s, "QUICKTLS.DAT");
66 fp = _fsopen(s, "r", SH_DENYWR);
67 if (fp) {
68 x = 0;
69 while (!feof(fp)) {
70 if (!xfgets_bstripcr(s, CCHMAXPATH + 2, fp, pszSrcFile, __LINE__))
71 break;
72 if (!*s || *s == ';')
73 continue;
74 if (x >= 50) {
75 Runtime_Error(pszSrcFile, __LINE__, "add");
76 break;
77 }
78 quicktool[x] = xstrdup(s, pszSrcFile, __LINE__);
79 if (!quicktool[x])
80 break;
81 x++;
82 }
83 fclose(fp);
84 }
85}
86
87VOID save_quicktools(VOID)
88{
89 FILE *fp;
90 INT x = 0;
91 CHAR s[CCHMAXPATH + 14];
92
93 if (!quicktool[0])
94 return;
95 save_dir2(s);
96 if (s[strlen(s) - 1] != '\\')
97 strcat(s, "\\");
98 strcat(s, "QUICKTLS.DAT");
99 fp = xfopen(s, "w", pszSrcFile, __LINE__);
100 if (fp) {
101 for (x = 0; quicktool[x] && x < 50; x++)
102 fprintf(fp, "%s\n", quicktool[x]);
103 fclose(fp);
104 }
105}
106
107//== load_tools() Build tools list given .tls filename ==
108
109TOOL *load_tools(CHAR * filename)
110{
111 FILE *fp;
112 CHAR help[80], text[80], flagstr[80], idstr[80], *fname;
113 TOOL *info;
114
115 if (!fToolbar) {
116 toolhead = free_tools();
117 return toolhead;
118 }
119 if (!filename || !*filename)
120 filename = (*lasttoolbox) ? lasttoolbox : "CMDS.TLS";
121 if (*filename)
122 fname = searchpath(filename);
123 if (!fname || !*fname)
124 fname = "FM3TOOLS.DAT";
125 if (fname && *fname) {
126 filename = fname;
127 strcpy(lasttoolbox, filename);
128 fp = _fsopen(filename, "r", SH_DENYWR);
129 if (fp) {
130 toolhead = free_tools();
131 while (!feof(fp)) {
132 do {
133 if (!xfgets(help, sizeof(help), fp, pszSrcFile, __LINE__))
134 break;
135 } while (*help == ';' && !feof(fp));
136 stripcr(help);
137 if (!xfgets(text, sizeof(text), fp, pszSrcFile, __LINE__))
138 break;
139 stripcr(text);
140 if (!xfgets(flagstr, sizeof(flagstr), fp, pszSrcFile, __LINE__))
141 break;
142 if (!xfgets(idstr, sizeof(idstr), fp, pszSrcFile, __LINE__))
143 break;
144 if (!(USHORT) atoi(idstr))
145 continue;
146 info = xmallocz(sizeof(TOOL), pszSrcFile, __LINE__);
147 if (info) {
148# ifdef FORTIFY
149 Fortify_SetOwner(info, 1);
150 Fortify_SetScope(info, 1);
151# endif
152 if (*help) {
153 literal(help);
154 if (*help) {
155 info->help = xstrdup(help, pszSrcFile, __LINE__);
156# ifdef FORTIFY
157 Fortify_SetOwner(info->help, 1);
158 Fortify_SetScope(info->help, 1);
159# endif
160 }
161 }
162 if (*text) {
163 info->text = xstrdup(text, pszSrcFile, __LINE__);
164# ifdef FORTIFY
165 Fortify_SetOwner(info->text, 1);
166 Fortify_SetScope(info->text, 1);
167# endif
168 }
169 info->flags = (atoi(flagstr) & (~(T_TEXT | T_EMPHASIZED)));
170 info->id = (USHORT) atoi(idstr);
171 info->next = NULL;
172 add_tool(info);
173 }
174 }
175 fclose(fp);
176 fToolsChanged = FALSE;
177 }
178 }
179 return toolhead;
180}
181
182VOID save_tools(CHAR * filename)
183{
184 FILE *fp;
185 CHAR *fname;
186 TOOL *info;
187
188 if (!filename)
189 filename = lasttoolbox;
190 if (*filename)
191 fname = searchpath(filename);
192 if (fname && *fname)
193 filename = fname;
194 else {
195 if (*lasttoolbox)
196 filename = lasttoolbox;
197 else
198 filename = "FM3TOOLS.TLS";
199 fname = searchpath(filename);
200 if (fname && *fname)
201 filename = fname;
202 }
203
204 if (stristr(filename, "FM3TOOLS.DAT"))
205 filename = "FM3TOOLS.TLS";
206 if (toolhead && filename && *filename) {
207 strcpy(lasttoolbox, filename);
208 PrfWriteProfileString(fmprof, FM3Str, "LastToolBox", filename);
209 }
210 if (!toolhead) {
211 unlinkf("%s", filename);
212 return;
213 }
214 fp = xfopen(filename, "w", pszSrcFile, __LINE__);
215 if (fp) {
216 fprintf(fp, GetPString(IDS_TOOLFILETEXT), filename);
217 info = toolhead;
218 while (info) {
219 fprintf(fp,
220 "%s\n%s\n%u\n%u\n;\n",
221 (info->help) ? info->help : NullStr,
222 (info->text) ? info->text : NullStr,
223 (info->flags & (~(T_EMPHASIZED | T_TEXT))), info->id);
224 info = info->next;
225 }
226 fclose(fp);
227 fToolsChanged = FALSE;
228 }
229 if (hwndMain)
230 PostMsg(hwndMain, UM_FILLBUTTONLIST, MPVOID, MPVOID);
231}
232
233TOOL *add_tool(TOOL * tool)
234{
235 TOOL *info;
236
237 if (tool) {
238 info = toolhead;
239 if (info) {
240 while (info->next)
241 info = info->next;
242 }
243 if (info)
244 info->next = tool;
245 else
246 toolhead = tool;
247 fToolsChanged = TRUE;
248 }
249 return toolhead;
250}
251
252TOOL *insert_tool(TOOL * tool, TOOL * after)
253{
254 if (tool) {
255 if (!toolhead)
256 return add_tool(tool);
257 if (!after) {
258 tool->next = toolhead;
259 toolhead = tool;
260 fToolsChanged = TRUE;
261 }
262 else {
263 tool->next = after->next;
264 after->next = tool;
265 fToolsChanged = TRUE;
266 }
267 }
268 return toolhead;
269}
270
271TOOL *del_tool(TOOL * tool)
272{
273 TOOL *info, *prev = NULL;
274
275 if (tool) {
276 info = toolhead;
277 while (info) {
278 if (info == tool) {
279 if (info == toolhead)
280 toolhead = info->next;
281 if (prev)
282 prev->next = info->next;
283 xfree(info->help, pszSrcFile, __LINE__);
284 xfree(info->text, pszSrcFile, __LINE__);
285 free(info);
286 fToolsChanged = TRUE;
287 break;
288 }
289 prev = info;
290 info = info->next;
291 }
292 }
293 return toolhead;
294}
295
296TOOL *find_tool(USHORT id)
297{
298 TOOL *tool;
299
300 if (id) {
301 tool = toolhead;
302 while (tool) {
303 if (id && tool->id == id)
304 return tool;
305 tool = tool->next;
306 }
307 }
308 return NULL;
309}
310
311TOOL *next_tool(TOOL * tool, BOOL skipinvisible)
312{
313 while (tool) {
314 if (tool->next && (skipinvisible && (tool->next->flags & T_INVISIBLE)))
315 tool = tool->next;
316 else
317 return (tool->next) ? tool->next : toolhead;
318 }
319 return NULL;
320}
321
322TOOL *prev_tool(TOOL * tool, BOOL skipinvisible)
323{
324 TOOL *info;
325
326Again:
327 while (tool) {
328 info = toolhead;
329 while (info) {
330 if (info->next == tool) {
331 if (skipinvisible && (info->flags & T_INVISIBLE)) {
332 tool = info;
333 goto Again;
334 }
335 return info;
336 }
337 if (!info->next && tool == toolhead)
338 return info;
339 info = info->next;
340 }
341 return toolhead;
342 }
343 return NULL;
344}
345
346TOOL *swap_tools(TOOL * tool1, TOOL * tool2)
347{
348 TOOL *prev1 = NULL, *prev2 = NULL, *info;
349
350 if (tool1 && tool2 && tool1 != tool2) {
351 info = toolhead;
352 while (info && !prev1 && !prev2) {
353 if (info->next == tool1)
354 prev1 = info;
355 else if (info->next == tool2)
356 prev2 = info;
357 info = info->next;
358 }
359 info = tool2;
360 tool2 = tool1;
361 tool1 = info;
362 info = tool2->next;
363 if (prev1)
364 prev1->next = tool2;
365 if (prev2)
366 prev2->next = tool1;
367 tool2->next = tool1->next;
368 tool1->next = info;
369 fToolsChanged = TRUE;
370 }
371 return toolhead;
372}
373
374TOOL *free_tools(VOID)
375{
376 TOOL *tool, *next;
377
378 tool = toolhead;
379 while (tool) {
380 next = tool->next;
381 xfree(tool->help, pszSrcFile, __LINE__);
382 xfree(tool->text, pszSrcFile, __LINE__);
383 free(tool);
384 tool = next;
385 }
386 toolhead = NULL;
387 return toolhead;
388}
389
390MRESULT EXPENTRY ReOrderToolsProc(HWND hwnd, ULONG msg, MPARAM mp1,
391 MPARAM mp2)
392{
393 switch (msg) {
394 case WM_INITDLG:
395 if (!toolhead || !toolhead->next)
396 WinDismissDlg(hwnd, 0);
397 WinSetWindowText(hwnd, GetPString(IDS_RETOOLTEXT));
398 {
399 TOOL *tool;
400 CHAR s[133];
401 SHORT sSelect;
402
403 tool = toolhead;
404 while (tool) {
405 sprintf(s, "%-5u %s", tool->id, (tool->help) ? tool->help : "?");
406 sSelect = (SHORT) WinSendDlgItemMsg(hwnd,
407 RE_ADDLISTBOX,
408 LM_INSERTITEM,
409 MPFROMSHORT(LIT_END), MPFROMP(s));
410 if (sSelect >= 0)
411 WinSendDlgItemMsg(hwnd,
412 RE_ADDLISTBOX,
413 LM_SETITEMHANDLE,
414 MPFROMSHORT(sSelect), MPFROMLONG((ULONG) tool));
415 tool = tool->next;
416 }
417 }
418 break;
419
420 case WM_CONTROL:
421 return 0;
422
423 case WM_COMMAND:
424 switch (SHORT1FROMMP(mp1)) {
425 case DID_CANCEL:
426 WinDismissDlg(hwnd, 0);
427 break;
428
429 case DID_OK:
430 {
431 TOOL *tool, *thead = NULL, *last = NULL;
432 SHORT sSelect = 0, numitems;
433
434 numitems = (SHORT) WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX,
435 LM_QUERYITEMCOUNT,
436 MPVOID, MPVOID);
437 while (numitems) {
438 tool = (TOOL *) WinSendDlgItemMsg(hwnd, RE_REMOVELISTBOX,
439 LM_QUERYITEMHANDLE,
440 MPFROMSHORT(sSelect++), MPVOID);
441 if (tool) {
442 if (!thead)
443 thead = tool;
444 else
445 last->next = tool;
446 last = tool;
447 }
448 numitems--;
449 }
450 sSelect = 0;
451 numitems = (SHORT) WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX,
452 LM_QUERYITEMCOUNT,
453 MPVOID, MPVOID);
454 while (numitems) {
455 tool = (TOOL *) WinSendDlgItemMsg(hwnd, RE_ADDLISTBOX,
456 LM_QUERYITEMHANDLE,
457 MPFROMSHORT(sSelect++), MPVOID);
458 if (tool) {
459 if (!thead)
460 thead = tool;
461 else
462 last->next = tool;
463 last = tool;
464 }
465 numitems--;
466 }
467 if (last)
468 last->next = NULL;
469 toolhead = thead;
470 }
471 fToolsChanged = TRUE;
472 WinDismissDlg(hwnd, 1);
473 break;
474
475 case IDM_HELP:
476 if (hwndHelp)
477 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
478 MPFROM2SHORT(HELP_REORDERBUTTONS, 0),
479 MPFROMSHORT(HM_RESOURCEID));
480 break;
481
482 case RE_ADD:
483 {
484 SHORT sSelect, sSelect2;
485 CHAR s[133];
486 TOOL *tool;
487
488 sSelect = (USHORT) WinSendDlgItemMsg(hwnd,
489 RE_ADDLISTBOX,
490 LM_QUERYSELECTION,
491 MPFROMSHORT(LIT_FIRST), MPVOID);
492 while (sSelect >= 0) {
493 tool = (TOOL *) WinSendDlgItemMsg(hwnd,
494 RE_ADDLISTBOX,
495 LM_QUERYITEMHANDLE,
496 MPFROMSHORT(sSelect), MPVOID);
497 if (tool) {
498 sprintf(s, "%-5u %s", tool->id, (tool->help) ? tool->help : "?");
499 sSelect2 = (SHORT) WinSendDlgItemMsg(hwnd,
500 RE_REMOVELISTBOX,
501 LM_INSERTITEM,
502 MPFROM2SHORT(LIT_END, 0),
503 MPFROMP(s));
504 if (sSelect2 >= 0)
505 WinSendDlgItemMsg(hwnd,
506 RE_REMOVELISTBOX,
507 LM_SETITEMHANDLE,
508 MPFROMSHORT(sSelect2),
509 MPFROMLONG((ULONG) tool));
510 WinSendDlgItemMsg(hwnd,
511 RE_ADDLISTBOX,
512 LM_DELETEITEM, MPFROMSHORT(sSelect), MPVOID);
513 }
514 else
515 WinSendDlgItemMsg(hwnd,
516 RE_ADDLISTBOX,
517 LM_SELECTITEM,
518 MPFROMSHORT(sSelect), MPFROMSHORT(FALSE));
519 sSelect = (USHORT) WinSendDlgItemMsg(hwnd,
520 RE_ADDLISTBOX,
521 LM_QUERYSELECTION,
522 MPFROMSHORT(LIT_FIRST),
523 MPVOID);
524 }
525 }
526 break;
527
528 case RE_REMOVE:
529 {
530 SHORT sSelect, sSelect2;
531 CHAR s[133];
532 TOOL *tool;
533
534 sSelect = (USHORT) WinSendDlgItemMsg(hwnd,
535 RE_REMOVELISTBOX,
536 LM_QUERYSELECTION,
537 MPFROMSHORT(LIT_FIRST), MPVOID);
538 while (sSelect >= 0) {
539 tool = (TOOL *) WinSendDlgItemMsg(hwnd,
540 RE_REMOVELISTBOX,
541 LM_QUERYITEMHANDLE,
542 MPFROMSHORT(sSelect), MPVOID);
543 if (tool) {
544 sprintf(s, "%-5u %s", tool->id, (tool->help) ? tool->help : "?");
545 sSelect2 = (SHORT) WinSendDlgItemMsg(hwnd,
546 RE_ADDLISTBOX,
547 LM_INSERTITEM,
548 MPFROM2SHORT(LIT_END, 0),
549 MPFROMP(s));
550 if (sSelect2 >= 0)
551 WinSendDlgItemMsg(hwnd,
552 RE_ADDLISTBOX,
553 LM_SETITEMHANDLE,
554 MPFROMSHORT(sSelect2),
555 MPFROMLONG((ULONG) tool));
556 WinSendDlgItemMsg(hwnd,
557 RE_REMOVELISTBOX,
558 LM_DELETEITEM, MPFROMSHORT(sSelect), MPVOID);
559 }
560 else
561 WinSendDlgItemMsg(hwnd,
562 RE_REMOVELISTBOX,
563 LM_SELECTITEM,
564 MPFROMSHORT(sSelect), MPFROMSHORT(FALSE));
565 sSelect = (USHORT) WinSendDlgItemMsg(hwnd,
566 RE_REMOVELISTBOX,
567 LM_QUERYSELECTION,
568 MPFROMSHORT(LIT_FIRST),
569 MPVOID);
570 }
571 }
572 break;
573 }
574 return 0;
575 }
576 return WinDefDlgProc(hwnd, msg, mp1, mp2);
577}
578
579MRESULT EXPENTRY AddToolProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
580{
581 switch (msg) {
582 case WM_INITDLG:
583 WinSetWindowPtr(hwnd, QWL_USER, mp2);
584 if (mp2) {
585 WinSetWindowText(hwnd, GetPString(IDS_EDITTOOLTEXT));
586 WinSendDlgItemMsg(hwnd, ADDBTN_ID, EM_SETREADONLY,
587 MPFROM2SHORT(TRUE, 0), MPVOID);
588 }
589 WinSendDlgItemMsg(hwnd, ADDBTN_HELP, EM_SETTEXTLIMIT,
590 MPFROM2SHORT(80, 0), MPVOID);
591 WinSendDlgItemMsg(hwnd, ADDBTN_TEXT, EM_SETTEXTLIMIT,
592 MPFROM2SHORT(80, 0), MPVOID);
593 WinSendDlgItemMsg(hwnd, ADDBTN_ID, EM_SETTEXTLIMIT,
594 MPFROM2SHORT(5, 0), MPVOID);
595 if (!mp2)
596 WinCheckButton(hwnd, ADDBTN_VISIBLE, TRUE);
597 else {
598 TOOL *tool = (TOOL *) mp2;
599 CHAR s[33];
600
601 if (tool->help)
602 WinSetDlgItemText(hwnd, ADDBTN_HELP, tool->help);
603 if (tool->text)
604 WinSetDlgItemText(hwnd, ADDBTN_TEXT, tool->text);
605 if (tool->flags & T_MYICON)
606 WinCheckButton(hwnd, ADDBTN_MYICON, TRUE);
607 else
608 WinEnableWindow(WinWindowFromID(hwnd, ADDBTN_EDITBMP), FALSE);
609 if (tool->flags & T_DROPABLE)
610 WinCheckButton(hwnd, ADDBTN_DROPABLE, TRUE);
611 if (!(tool->flags & T_INVISIBLE))
612 WinCheckButton(hwnd, ADDBTN_VISIBLE, TRUE);
613 if (tool->flags & T_SEPARATOR)
614 WinCheckButton(hwnd, ADDBTN_SEPARATOR, TRUE);
615 if (tool->flags & T_TEXT)
616 WinCheckButton(hwnd, ADDBTN_SHOWTEXT, TRUE);
617 sprintf(s, "%u", tool->id);
618 WinSetDlgItemText(hwnd, ADDBTN_ID, s);
619 WinEnableWindow(WinWindowFromID(hwnd, ADDBTN_SHOWTEXT), FALSE);
620 }
621 WinShowWindow(WinWindowFromID(hwnd, ADDBTN_SHOWTEXT), FALSE);
622 PostMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
623 break;
624
625 case WM_ADJUSTWINDOWPOS:
626 PostMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
627 break;
628
629 case UM_SETDIR:
630 PaintRecessedWindow(WinWindowFromID(hwnd, ADDBTN_HELPME), (HPS) 0, FALSE,
631 TRUE);
632 PaintRecessedWindow(WinWindowFromID(hwnd, ADDBTN_BMP), (HPS) 0, TRUE,
633 FALSE);
634 return 0;
635
636 case UM_SETUP:
637 {
638 HBITMAP hbm = (HBITMAP) 0, hbmd, hbmdd;
639 HPS hps;
640 CHAR idstr[7];
641 USHORT id;
642
643 *idstr = 0;
644 WinQueryDlgItemText(hwnd, ADDBTN_ID, 6, idstr);
645 id = atoi(idstr);
646 if (id) {
647 hps = WinGetPS(WinWindowFromID(hwnd, ADDBTN_BMP));
648 if (!WinQueryButtonCheckstate(hwnd, ADDBTN_MYICON))
649 hbm = GpiLoadBitmap(hps, 0, id, 28, 28);
650 if (!hbm)
651 hbm = LoadBitmapFromFileNum(id);
652 if (hbm) {
653 hbmd = (HBITMAP) WinSendDlgItemMsg(hwnd, ADDBTN_BMP, SM_QUERYHANDLE,
654 MPVOID, MPVOID);
655 hbmdd = (HBITMAP) WinSendDlgItemMsg(hwnd, ADDBTN_BMP, SM_SETHANDLE,
656 MPFROMLONG(hbm), MPVOID);
657 if (hbmdd && hbmd && hbmd != hbmdd)
658 GpiDeleteBitmap(hbmd);
659 }
660 }
661 }
662 return 0;
663
664 case WM_CONTROL:
665 switch (SHORT1FROMMP(mp1)) {
666 case ADDBTN_HELP:
667 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
668 WinSetDlgItemText(hwnd, ADDBTN_HELPME, NullStr);
669 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
670 WinSetDlgItemText(hwnd, ADDBTN_HELPME,
671 GetPString(IDS_ADDTOOLQUICKHELPTEXT));
672 break;
673
674 case ADDBTN_TEXT:
675 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS)
676 WinSetDlgItemText(hwnd, ADDBTN_HELPME, NullStr);
677 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
678 WinSetDlgItemText(hwnd, ADDBTN_HELPME,
679 GetPString(IDS_ADDTOOLBUTTONTEXT));
680 break;
681
682 case ADDBTN_ID:
683 if (SHORT2FROMMP(mp1) == EN_KILLFOCUS) {
684 WinSetDlgItemText(hwnd, ADDBTN_HELPME, NullStr);
685 PostMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
686 }
687 if (SHORT2FROMMP(mp1) == EN_SETFOCUS)
688 WinSetDlgItemText(hwnd,
689 ADDBTN_HELPME, GetPString(IDS_ADDTOOLBUTTONIDTEXT));
690 break;
691
692 case ADDBTN_MYICON:
693 PostMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
694 WinEnableWindow(WinWindowFromID(hwnd, ADDBTN_EDITBMP),
695 WinQueryButtonCheckstate(hwnd, ADDBTN_MYICON));
696 break;
697 }
698 return 0;
699
700 case WM_COMMAND:
701 switch (SHORT1FROMMP(mp1)) {
702 case DID_OK:
703 {
704 CHAR help[81], text[81], idstr[7];
705 BOOL invisible, dropable, separator, istext, myicon;
706 TOOL *tool;
707
708 WinQueryDlgItemText(hwnd, ADDBTN_HELP, 80, help);
709 WinQueryDlgItemText(hwnd, ADDBTN_TEXT, 80, text);
710 if (WinQueryButtonCheckstate(hwnd, ADDBTN_DROPABLE))
711 dropable = TRUE;
712 else
713 dropable = FALSE;
714 myicon = WinQueryButtonCheckstate(hwnd, ADDBTN_MYICON);
715 if (WinQueryButtonCheckstate(hwnd, ADDBTN_VISIBLE))
716 invisible = FALSE;
717 else
718 invisible = TRUE;
719 if (WinQueryButtonCheckstate(hwnd, ADDBTN_SEPARATOR))
720 separator = TRUE;
721 else
722 separator = FALSE;
723 if (WinQueryButtonCheckstate(hwnd, ADDBTN_SHOWTEXT))
724 istext = TRUE;
725 else
726 istext = FALSE;
727 tool = INSTDATA(hwnd);
728 if (tool) { /* just editing strings... */
729 istext = ((tool->flags & T_TEXT) != 0);
730 xfree(tool->help, pszSrcFile, __LINE__);
731 tool->help = NULL;
732 xfree(tool->text, pszSrcFile, __LINE__);
733 tool->text = NULL;
734 if (*help)
735 tool->help = xstrdup(help, pszSrcFile, __LINE__);
736 if (*text)
737 tool->text = xstrdup(text, pszSrcFile, __LINE__);
738 tool->flags = (((dropable) ? T_DROPABLE : 0) |
739 ((invisible) ? T_INVISIBLE : 0) |
740 ((separator) ? T_SEPARATOR : 0) |
741 ((myicon) ? T_MYICON : 0) | ((istext) ? T_TEXT : 0));
742 fToolsChanged = TRUE;
743 WinDismissDlg(hwnd, 1);
744 break;
745 }
746 *idstr = 0;
747 WinQueryDlgItemText(hwnd, ADDBTN_ID, 6, idstr);
748 if (!(USHORT) atoi(idstr)) {
749 DosBeep(250, 100);
750 break;
751 }
752 tool = toolhead;
753 while (tool) {
754 if (tool->id == (USHORT) atoi(idstr) && tool != tool) {
755 saymsg(MB_ENTER,
756 hwnd,
757 GetPString(IDS_DUPLICATETEXT),
758 GetPString(IDS_TOOLIDEXISTS));
759 WinSetDlgItemText(hwnd, ADDBTN_ID, NullStr);
760 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, ADDBTN_ID));
761 break;
762 }
763 tool = tool->next;
764 }
765 tool = xmallocz(sizeof(TOOL), pszSrcFile, __LINE__);
766 if (tool) {
767 if (*help)
768 tool->help = xstrdup(help, pszSrcFile, __LINE__);
769 if (*text)
770 tool->text = xstrdup(text, pszSrcFile, __LINE__);
771 tool->id = (USHORT) atoi(idstr);
772 tool->flags = (((dropable) ? T_DROPABLE : 0) |
773 ((invisible) ? T_INVISIBLE : 0) |
774 ((separator) ? T_SEPARATOR : 0) |
775 ((myicon) ? T_MYICON : 0) | ((istext) ? T_TEXT : 0));
776 add_tool(tool);
777 WinDismissDlg(hwnd, tool->id);
778 }
779 }
780 break;
781
782 case DID_CANCEL:
783 WinDismissDlg(hwnd, 0);
784 break;
785
786 case ADDBTN_EDITBMP:
787 {
788 CHAR idstr[6], filename[34];
789
790 *idstr = 0;
791 WinQueryDlgItemText(hwnd, ADDBTN_ID, 6, idstr);
792 if (!(USHORT) atoi(idstr)) {
793 DosBeep(250, 100);
794 break;
795 }
796 sprintf(filename, "%u.BMP", atoi(idstr));
797 if (IsFile(filename) != 1) {
798 CHAR s[CCHMAXPATH] = "EMPTY.BMP";
799
800 docopyf(COPY, s, filename);
801 }
802 runemf2(SEPARATE | WINDOWED,
803 hwnd, pszSrcFile, __LINE__,
804 NULL, NULL, "ICONEDIT.EXE %s", filename);
805 }
806 break;
807
808 case IDM_HELP:
809 if (hwndHelp) {
810 if (INSTDATA(hwnd))
811 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
812 MPFROM2SHORT(HELP_CHANGEBUTTON, 0),
813 MPFROMSHORT(HM_RESOURCEID));
814 else
815 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
816 MPFROM2SHORT(HELP_ADDBUTTON, 0),
817 MPFROMSHORT(HM_RESOURCEID));
818 }
819 break;
820 }
821 return 0;
822 }
823 return WinDefDlgProc(hwnd, msg, mp1, mp2);
824}
825
826MRESULT EXPENTRY PickToolProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
827{
828 switch (msg) {
829 case WM_INITDLG:
830 if (mp2) {
831 CHAR s[133];
832
833 sprintf(s, GetPString(IDS_PICKTOOLTITLETEXT), (CHAR *)mp2);
834 WinSetWindowText(hwnd, s);
835 }
836 {
837 TOOL *tool;
838 CHAR s[133];
839
840 tool = toolhead;
841 while (tool) {
842 sprintf(s, "%-5u %s", tool->id, (tool->help) ? tool->help : "?");
843 WinSendDlgItemMsg(hwnd,
844 PICKBTN_LISTBOX,
845 LM_INSERTITEM, MPFROMSHORT(LIT_END), MPFROMP(s));
846 tool = tool->next;
847 }
848 }
849 break;
850
851 case WM_CONTROL:
852 if (SHORT1FROMMP(mp1) == PICKBTN_LISTBOX) {
853 switch (SHORT2FROMMP(mp1)) {
854 case LN_ENTER:
855 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(DID_OK, 0), MPVOID);
856 break;
857 }
858 }
859 return 0;
860
861 case WM_COMMAND:
862 switch (SHORT1FROMMP(mp1)) {
863 case DID_CANCEL:
864 WinDismissDlg(hwnd, 0);
865 break;
866 case DID_OK:
867 {
868 SHORT sSelect;
869 CHAR s[33];
870
871 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, PICKBTN_LISTBOX,
872 LM_QUERYSELECTION,
873 MPFROMSHORT(LIT_FIRST), MPVOID);
874 if (sSelect >= 0) {
875 *s = 0;
876 WinSendDlgItemMsg(hwnd, PICKBTN_LISTBOX, LM_QUERYITEMTEXT,
877 MPFROM2SHORT(sSelect, 32), MPFROMP(s));
878 if (*s)
879 WinDismissDlg(hwnd, (USHORT) atoi(s));
880 }
881 }
882 break;
883 }
884 return 0;
885 }
886 return WinDefDlgProc(hwnd, msg, mp1, mp2);
887}
888
889MRESULT EXPENTRY ToolIODlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
890{
891 switch (msg) {
892 case WM_INITDLG:
893 if (mp2)
894 WinSetWindowULong(hwnd, QWL_USER, TRUE);
895 else {
896 WinSetWindowULong(hwnd, QWL_USER, FALSE);
897 WinSetWindowText(hwnd, GetPString(IDS_LOADTOOLBOXTITLETEXT));
898 }
899 WinSendDlgItemMsg(hwnd,
900 SVBTN_ENTRY,
901 EM_SETTEXTLIMIT, MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
902 {
903 FILEFINDBUF3 findbuf;
904 HDIR hDir;
905 ULONG ulSearchCount, x = 0;
906 CHAR *masks[] = { "*.TLS", "FM3TOOLS.DAT", NULL };
907
908 if (mp2)
909 masks[1] = NULL;
910 while (masks[x]) {
911 hDir = HDIR_CREATE;
912 ulSearchCount = 1;
913 DosError(FERR_DISABLEHARDERR);
914 if (!DosFindFirst(masks[x],
915 &hDir,
916 FILE_ARCHIVED,
917 &findbuf,
918 sizeof(FILEFINDBUF3),
919 &ulSearchCount, FIL_STANDARD)) {
920 do {
921 priority_bumped();
922 WinSendMsg(WinWindowFromID(hwnd,
923 SVBTN_LISTBOX),
924 LM_INSERTITEM,
925 MPFROM2SHORT(LIT_SORTASCENDING, 0),
926 MPFROMP(findbuf.achName));
927 ulSearchCount = 1;
928 } while (!DosFindNext(hDir,
929 &findbuf,
930 sizeof(FILEFINDBUF3), &ulSearchCount));
931 DosFindClose(hDir);
932 priority_bumped();
933 }
934 x++;
935 }
936 DosError(FERR_DISABLEHARDERR);
937 }
938 if (!WinSendDlgItemMsg(hwnd,
939 SVBTN_LISTBOX,
940 LM_QUERYITEMCOUNT, MPVOID, MPVOID)) {
941 WinEnableWindow(WinWindowFromID(hwnd, SVBTN_LISTBOX), FALSE);
942 PostMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
943 }
944 WinSetDlgItemText(hwnd,
945 SVBTN_CURRENT,
946 (*lasttoolbox) ? lasttoolbox : "FM3TOOLS.DAT");
947 break;
948
949 case UM_SETUP:
950 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, SVBTN_ENTRY));
951 return 0;
952
953 case WM_CONTROL:
954 if (SHORT1FROMMP(mp1) == SVBTN_LISTBOX) {
955 SHORT sSelect;
956 CHAR szBuffer[CCHMAXPATH];
957
958 switch (SHORT2FROMMP(mp1)) {
959 case LN_SELECT:
960 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SVBTN_LISTBOX,
961 LM_QUERYSELECTION,
962 MPFROMSHORT(LIT_FIRST), MPVOID);
963 if (sSelect >= 0) {
964 *szBuffer = 0;
965 WinSendDlgItemMsg(hwnd, SVBTN_LISTBOX, LM_QUERYITEMTEXT,
966 MPFROM2SHORT(sSelect, CCHMAXPATH),
967 MPFROMP(szBuffer));
968 if (*szBuffer)
969 WinSetDlgItemText(hwnd, SVBTN_ENTRY, szBuffer);
970 }
971 break;
972
973 case LN_ENTER:
974 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(DID_OK, 0), MPVOID);
975 break;
976 }
977 }
978 return 0;
979
980 case WM_COMMAND:
981 switch (SHORT1FROMMP(mp1)) {
982 case IDM_HELP:
983 if (hwndHelp) {
984 if (INSTDATA(hwnd))
985 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
986 MPFROM2SHORT(HELP_SAVETOOLS, 0),
987 MPFROMSHORT(HM_RESOURCEID));
988 else
989 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
990 MPFROM2SHORT(HELP_LOADTOOLS, 0),
991 MPFROMSHORT(HM_RESOURCEID));
992 }
993 break;
994
995 case DID_CANCEL:
996 WinDismissDlg(hwnd, 0);
997 break;
998
999 case DID_OK:
1000 {
1001 BOOL saving = WinQueryWindowULong(hwnd, QWL_USER);
1002 CHAR temptools[CCHMAXPATH];
1003
1004 strcpy(temptools, lasttoolbox);
1005 if (fToolsChanged)
1006 save_tools(NULL);
1007 WinQueryDlgItemText(hwnd,
1008 SVBTN_ENTRY, sizeof(lasttoolbox), lasttoolbox);
1009 if (*lasttoolbox) {
1010 if (!strchr(lasttoolbox, '.'))
1011 strcat(lasttoolbox, ".TLS");
1012 }
1013 if (saving && *lasttoolbox)
1014 save_tools(NULL);
1015 else {
1016 if (!load_tools(NULL)) {
1017 strcpy(lasttoolbox, temptools);
1018 if (!load_tools(NULL)) {
1019 *lasttoolbox = 0;
1020 load_tools(NULL);
1021 }
1022 }
1023 }
1024 PrfWriteProfileString(fmprof, FM3Str, "LastToolBox", lasttoolbox);
1025 }
1026 WinDismissDlg(hwnd, 1);
1027 break;
1028 }
1029 return 0;
1030 }
1031 return WinDefDlgProc(hwnd, msg, mp1, mp2);
1032}
1033
1034#pragma alloc_text(TOOLS,load_tools,save_tools,add_tool,insert_tool,del_tool,free_tools,swap_tools,load_quicktools,save_quicktools)
1035#pragma alloc_text(TOOLS1,ReOrderToolsProc,PickToolProc,AddToolProc,ToolIODlgProc)
Note: See TracBrowser for help on using the repository browser.