source: trunk/dll/tools.c@ 1104

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

Replace save_dir2(dir) with strcpy(dir, pFM2SaveDirectory)

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