source: trunk/dll/tools.c@ 1082

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

Changes so FM2 will use TMP/TEMP directory for all temp files; Replaced save_dir2 with global variable so BldFullPathName could easily replace code that performed the same function; Added #ifdef FORTIFY to free_ function that are only used when fortified.

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