source: trunk/dll/tools.c@ 1117

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

Check disk free space before writing data files to prevent traps from being on a full disk (ticket 154)

  • 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 1117 2008-08-24 18:31:35Z 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 if (CheckDriveSpaceAvail(s, ullDATFileSpaceNeeded, 0) == 2)
96 return; //already gave error msg
97 fp = xfopen(s, "w", pszSrcFile, __LINE__);
98 if (fp) {
99 for (x = 0; quicktool[x] && x < 50; x++)
100 fprintf(fp, "%s\n", quicktool[x]);
101 fclose(fp);
102 }
103}
104
105//== load_tools() Build tools list given .tls filename ==
106
107TOOL *load_tools(CHAR * filename)
108{
109 FILE *fp;
110 CHAR help[80], text[80], flagstr[80], idstr[80], *fname;
111 TOOL *info;
112
113 if (!fToolbar) {
114 toolhead = free_tools();
115 return toolhead;
116 }
117 if (!filename || !*filename)
118 filename = (*lasttoolbox) ? lasttoolbox : "CMDS.TLS";
119 if (*filename)
120 fname = searchpath(filename);
121 if (!fname || !*fname)
122 fname = "FM3TOOLS.DAT";
123 if (fname && *fname) {
124 filename = fname;
125 strcpy(lasttoolbox, filename);
126 fp = _fsopen(filename, "r", SH_DENYWR);
127 if (fp) {
128 toolhead = free_tools();
129 while (!feof(fp)) {
130 do {
131 if (!xfgets(help, sizeof(help), fp, pszSrcFile, __LINE__))
132 break;
133 } while (*help == ';' && !feof(fp));
134 stripcr(help);
135 if (!xfgets(text, sizeof(text), fp, pszSrcFile, __LINE__))
136 break;
137 stripcr(text);
138 if (!xfgets(flagstr, sizeof(flagstr), fp, pszSrcFile, __LINE__))
139 break;
140 if (!xfgets(idstr, sizeof(idstr), fp, pszSrcFile, __LINE__))
141 break;
142 if (!(USHORT) atoi(idstr))
143 continue;
144 info = xmallocz(sizeof(TOOL), pszSrcFile, __LINE__);
145 if (info) {
146# ifdef FORTIFY
147 Fortify_SetOwner(info, 1);
148 Fortify_SetScope(info, 1);
149# endif
150 if (*help) {
151 literal(help);
152 if (*help) {
153 info->help = xstrdup(help, pszSrcFile, __LINE__);
154# ifdef FORTIFY
155 Fortify_SetOwner(info->help, 1);
156 Fortify_SetScope(info->help, 1);
157# endif
158 }
159 }
160 if (*text) {
161 info->text = xstrdup(text, pszSrcFile, __LINE__);
162# ifdef FORTIFY
163 Fortify_SetOwner(info->text, 1);
164 Fortify_SetScope(info->text, 1);
165# endif
166 }
167 info->flags = (atoi(flagstr) & (~(T_TEXT | T_EMPHASIZED)));
168 info->id = (USHORT) atoi(idstr);
169 info->next = NULL;
170 add_tool(info);
171 }
172 }
173 fclose(fp);
174 fToolsChanged = FALSE;
175 }
176 }
177 return toolhead;
178}
179
180VOID save_tools(CHAR * filename)
181{
182 FILE *fp;
183 CHAR *fname;
184 TOOL *info;
185
186 if (!filename)
187 filename = lasttoolbox;
188 if (*filename)
189 fname = searchpath(filename);
190 if (fname && *fname)
191 filename = fname;
192 else {
193 if (*lasttoolbox)
194 filename = lasttoolbox;
195 else
196 filename = "FM3TOOLS.TLS";
197 fname = searchpath(filename);
198 if (fname && *fname)
199 filename = fname;
200 }
201
202 if (stristr(filename, "FM3TOOLS.DAT"))
203 filename = "FM3TOOLS.TLS";
204 if (toolhead && filename && *filename) {
205 strcpy(lasttoolbox, filename);
206 PrfWriteProfileString(fmprof, FM3Str, "LastToolBox", filename);
207 }
208 if (!toolhead) {
209 unlinkf("%s", filename);
210 return;
211 }
212 if (CheckDriveSpaceAvail(filename, ullDATFileSpaceNeeded, 0) == 2)
213 return; //already gave error msg
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 save_tools(NULL);
778 WinDismissDlg(hwnd, tool->id);
779 }
780 }
781 break;
782
783 case DID_CANCEL:
784 WinDismissDlg(hwnd, 0);
785 break;
786
787 case ADDBTN_EDITBMP:
788 {
789 CHAR idstr[6], filename[34];
790
791 *idstr = 0;
792 WinQueryDlgItemText(hwnd, ADDBTN_ID, 6, idstr);
793 if (!(USHORT) atoi(idstr)) {
794 DosBeep(250, 100);
795 break;
796 }
797 sprintf(filename, "%u.BMP", atoi(idstr));
798 if (IsFile(filename) != 1) {
799 CHAR s[CCHMAXPATH] = "EMPTY.BMP";
800
801 docopyf(COPY, s, filename);
802 }
803 runemf2(SEPARATE | WINDOWED,
804 hwnd, pszSrcFile, __LINE__,
805 NULL, NULL, "ICONEDIT.EXE %s", filename);
806 }
807 break;
808
809 case IDM_HELP:
810 if (hwndHelp) {
811 if (INSTDATA(hwnd))
812 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
813 MPFROM2SHORT(HELP_CHANGEBUTTON, 0),
814 MPFROMSHORT(HM_RESOURCEID));
815 else
816 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
817 MPFROM2SHORT(HELP_ADDBUTTON, 0),
818 MPFROMSHORT(HM_RESOURCEID));
819 }
820 break;
821 }
822 return 0;
823 }
824 return WinDefDlgProc(hwnd, msg, mp1, mp2);
825}
826
827MRESULT EXPENTRY PickToolProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
828{
829 switch (msg) {
830 case WM_INITDLG:
831 if (mp2) {
832 CHAR s[133];
833
834 sprintf(s, GetPString(IDS_PICKTOOLTITLETEXT), (CHAR *)mp2);
835 WinSetWindowText(hwnd, s);
836 }
837 {
838 TOOL *tool;
839 CHAR s[133];
840
841 tool = toolhead;
842 while (tool) {
843 sprintf(s, "%-5u %s", tool->id, (tool->help) ? tool->help : "?");
844 WinSendDlgItemMsg(hwnd,
845 PICKBTN_LISTBOX,
846 LM_INSERTITEM, MPFROMSHORT(LIT_END), MPFROMP(s));
847 tool = tool->next;
848 }
849 }
850 break;
851
852 case WM_CONTROL:
853 if (SHORT1FROMMP(mp1) == PICKBTN_LISTBOX) {
854 switch (SHORT2FROMMP(mp1)) {
855 case LN_ENTER:
856 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(DID_OK, 0), MPVOID);
857 break;
858 }
859 }
860 return 0;
861
862 case WM_COMMAND:
863 switch (SHORT1FROMMP(mp1)) {
864 case DID_CANCEL:
865 WinDismissDlg(hwnd, 0);
866 break;
867 case DID_OK:
868 {
869 SHORT sSelect;
870 CHAR s[33];
871
872 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, PICKBTN_LISTBOX,
873 LM_QUERYSELECTION,
874 MPFROMSHORT(LIT_FIRST), MPVOID);
875 if (sSelect >= 0) {
876 *s = 0;
877 WinSendDlgItemMsg(hwnd, PICKBTN_LISTBOX, LM_QUERYITEMTEXT,
878 MPFROM2SHORT(sSelect, 32), MPFROMP(s));
879 if (*s)
880 WinDismissDlg(hwnd, (USHORT) atoi(s));
881 }
882 }
883 break;
884 }
885 return 0;
886 }
887 return WinDefDlgProc(hwnd, msg, mp1, mp2);
888}
889
890MRESULT EXPENTRY ToolIODlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
891{
892 switch (msg) {
893 case WM_INITDLG:
894 if (mp2)
895 WinSetWindowULong(hwnd, QWL_USER, TRUE);
896 else {
897 WinSetWindowULong(hwnd, QWL_USER, FALSE);
898 WinSetWindowText(hwnd, GetPString(IDS_LOADTOOLBOXTITLETEXT));
899 }
900 WinSendDlgItemMsg(hwnd,
901 SVBTN_ENTRY,
902 EM_SETTEXTLIMIT, MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
903 {
904 FILEFINDBUF3 findbuf;
905 HDIR hDir;
906 ULONG ulSearchCount, x = 0;
907 CHAR *masks[] = { "*.TLS", "FM3TOOLS.DAT", NULL };
908
909 if (mp2)
910 masks[1] = NULL;
911 while (masks[x]) {
912 hDir = HDIR_CREATE;
913 ulSearchCount = 1;
914 DosError(FERR_DISABLEHARDERR);
915 if (!DosFindFirst(masks[x],
916 &hDir,
917 FILE_ARCHIVED,
918 &findbuf,
919 sizeof(FILEFINDBUF3),
920 &ulSearchCount, FIL_STANDARD)) {
921 do {
922 priority_bumped();
923 WinSendMsg(WinWindowFromID(hwnd,
924 SVBTN_LISTBOX),
925 LM_INSERTITEM,
926 MPFROM2SHORT(LIT_SORTASCENDING, 0),
927 MPFROMP(findbuf.achName));
928 ulSearchCount = 1;
929 } while (!DosFindNext(hDir,
930 &findbuf,
931 sizeof(FILEFINDBUF3), &ulSearchCount));
932 DosFindClose(hDir);
933 priority_bumped();
934 }
935 x++;
936 }
937 DosError(FERR_DISABLEHARDERR);
938 }
939 if (!WinSendDlgItemMsg(hwnd,
940 SVBTN_LISTBOX,
941 LM_QUERYITEMCOUNT, MPVOID, MPVOID)) {
942 WinEnableWindow(WinWindowFromID(hwnd, SVBTN_LISTBOX), FALSE);
943 PostMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
944 }
945 WinSetDlgItemText(hwnd,
946 SVBTN_CURRENT,
947 (*lasttoolbox) ? lasttoolbox : "FM3TOOLS.DAT");
948 break;
949
950 case UM_SETUP:
951 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, SVBTN_ENTRY));
952 return 0;
953
954 case WM_CONTROL:
955 if (SHORT1FROMMP(mp1) == SVBTN_LISTBOX) {
956 SHORT sSelect;
957 CHAR szBuffer[CCHMAXPATH];
958
959 switch (SHORT2FROMMP(mp1)) {
960 case LN_SELECT:
961 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SVBTN_LISTBOX,
962 LM_QUERYSELECTION,
963 MPFROMSHORT(LIT_FIRST), MPVOID);
964 if (sSelect >= 0) {
965 *szBuffer = 0;
966 WinSendDlgItemMsg(hwnd, SVBTN_LISTBOX, LM_QUERYITEMTEXT,
967 MPFROM2SHORT(sSelect, CCHMAXPATH),
968 MPFROMP(szBuffer));
969 if (*szBuffer)
970 WinSetDlgItemText(hwnd, SVBTN_ENTRY, szBuffer);
971 }
972 break;
973
974 case LN_ENTER:
975 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(DID_OK, 0), MPVOID);
976 break;
977 }
978 }
979 return 0;
980
981 case WM_COMMAND:
982 switch (SHORT1FROMMP(mp1)) {
983 case IDM_HELP:
984 if (hwndHelp) {
985 if (INSTDATA(hwnd))
986 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
987 MPFROM2SHORT(HELP_SAVETOOLS, 0),
988 MPFROMSHORT(HM_RESOURCEID));
989 else
990 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
991 MPFROM2SHORT(HELP_LOADTOOLS, 0),
992 MPFROMSHORT(HM_RESOURCEID));
993 }
994 break;
995
996 case DID_CANCEL:
997 WinDismissDlg(hwnd, 0);
998 break;
999
1000 case DID_OK:
1001 {
1002 BOOL saving = WinQueryWindowULong(hwnd, QWL_USER);
1003 CHAR temptools[CCHMAXPATH];
1004
1005 strcpy(temptools, lasttoolbox);
1006 if (fToolsChanged)
1007 save_tools(NULL);
1008 WinQueryDlgItemText(hwnd,
1009 SVBTN_ENTRY, sizeof(lasttoolbox), lasttoolbox);
1010 if (*lasttoolbox) {
1011 if (!strchr(lasttoolbox, '.'))
1012 strcat(lasttoolbox, ".TLS");
1013 }
1014 if (saving && *lasttoolbox)
1015 save_tools(NULL);
1016 else {
1017 if (!load_tools(NULL)) {
1018 strcpy(lasttoolbox, temptools);
1019 if (!load_tools(NULL)) {
1020 *lasttoolbox = 0;
1021 load_tools(NULL);
1022 }
1023 }
1024 }
1025 PrfWriteProfileString(fmprof, FM3Str, "LastToolBox", lasttoolbox);
1026 }
1027 WinDismissDlg(hwnd, 1);
1028 break;
1029 }
1030 return 0;
1031 }
1032 return WinDefDlgProc(hwnd, msg, mp1, mp2);
1033}
1034
1035#pragma alloc_text(TOOLS,load_tools,save_tools,add_tool,insert_tool,del_tool,free_tools,swap_tools)
1036#pragma alloc_text(TOOLS,load_quicktools,save_quicktools)
1037#pragma alloc_text(TOOLS1,ReOrderToolsProc,PickToolProc,AddToolProc,ToolIODlgProc)
Note: See TracBrowser for help on using the repository browser.