source: trunk/dll/tools.c@ 1039

Last change on this file since 1039 was 1039, checked in by Gregg Young, 17 years ago

Removed unnecessary xfrees and included fortify.h where needed; moved several misplaced (x)frees;

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