source: trunk/dll/tools.c@ 1119

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

Comments for CS 1118 (Tickets 154 (not 152), 270)

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