source: trunk/dll/tools.c@ 1108

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

Toolbox is saved when a new button is added (Ticket 260)

  • 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 1108 2008-08-18 22:39:14Z 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 save_tools(NULL);
774 WinDismissDlg(hwnd, tool->id);
775 }
776 }
777 break;
778
779 case DID_CANCEL:
780 WinDismissDlg(hwnd, 0);
781 break;
782
783 case ADDBTN_EDITBMP:
784 {
785 CHAR idstr[6], filename[34];
786
787 *idstr = 0;
788 WinQueryDlgItemText(hwnd, ADDBTN_ID, 6, idstr);
789 if (!(USHORT) atoi(idstr)) {
790 DosBeep(250, 100);
791 break;
792 }
793 sprintf(filename, "%u.BMP", atoi(idstr));
794 if (IsFile(filename) != 1) {
795 CHAR s[CCHMAXPATH] = "EMPTY.BMP";
796
797 docopyf(COPY, s, filename);
798 }
799 runemf2(SEPARATE | WINDOWED,
800 hwnd, pszSrcFile, __LINE__,
801 NULL, NULL, "ICONEDIT.EXE %s", filename);
802 }
803 break;
804
805 case IDM_HELP:
806 if (hwndHelp) {
807 if (INSTDATA(hwnd))
808 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
809 MPFROM2SHORT(HELP_CHANGEBUTTON, 0),
810 MPFROMSHORT(HM_RESOURCEID));
811 else
812 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
813 MPFROM2SHORT(HELP_ADDBUTTON, 0),
814 MPFROMSHORT(HM_RESOURCEID));
815 }
816 break;
817 }
818 return 0;
819 }
820 return WinDefDlgProc(hwnd, msg, mp1, mp2);
821}
822
823MRESULT EXPENTRY PickToolProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
824{
825 switch (msg) {
826 case WM_INITDLG:
827 if (mp2) {
828 CHAR s[133];
829
830 sprintf(s, GetPString(IDS_PICKTOOLTITLETEXT), (CHAR *)mp2);
831 WinSetWindowText(hwnd, s);
832 }
833 {
834 TOOL *tool;
835 CHAR s[133];
836
837 tool = toolhead;
838 while (tool) {
839 sprintf(s, "%-5u %s", tool->id, (tool->help) ? tool->help : "?");
840 WinSendDlgItemMsg(hwnd,
841 PICKBTN_LISTBOX,
842 LM_INSERTITEM, MPFROMSHORT(LIT_END), MPFROMP(s));
843 tool = tool->next;
844 }
845 }
846 break;
847
848 case WM_CONTROL:
849 if (SHORT1FROMMP(mp1) == PICKBTN_LISTBOX) {
850 switch (SHORT2FROMMP(mp1)) {
851 case LN_ENTER:
852 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(DID_OK, 0), MPVOID);
853 break;
854 }
855 }
856 return 0;
857
858 case WM_COMMAND:
859 switch (SHORT1FROMMP(mp1)) {
860 case DID_CANCEL:
861 WinDismissDlg(hwnd, 0);
862 break;
863 case DID_OK:
864 {
865 SHORT sSelect;
866 CHAR s[33];
867
868 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, PICKBTN_LISTBOX,
869 LM_QUERYSELECTION,
870 MPFROMSHORT(LIT_FIRST), MPVOID);
871 if (sSelect >= 0) {
872 *s = 0;
873 WinSendDlgItemMsg(hwnd, PICKBTN_LISTBOX, LM_QUERYITEMTEXT,
874 MPFROM2SHORT(sSelect, 32), MPFROMP(s));
875 if (*s)
876 WinDismissDlg(hwnd, (USHORT) atoi(s));
877 }
878 }
879 break;
880 }
881 return 0;
882 }
883 return WinDefDlgProc(hwnd, msg, mp1, mp2);
884}
885
886MRESULT EXPENTRY ToolIODlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
887{
888 switch (msg) {
889 case WM_INITDLG:
890 if (mp2)
891 WinSetWindowULong(hwnd, QWL_USER, TRUE);
892 else {
893 WinSetWindowULong(hwnd, QWL_USER, FALSE);
894 WinSetWindowText(hwnd, GetPString(IDS_LOADTOOLBOXTITLETEXT));
895 }
896 WinSendDlgItemMsg(hwnd,
897 SVBTN_ENTRY,
898 EM_SETTEXTLIMIT, MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
899 {
900 FILEFINDBUF3 findbuf;
901 HDIR hDir;
902 ULONG ulSearchCount, x = 0;
903 CHAR *masks[] = { "*.TLS", "FM3TOOLS.DAT", NULL };
904
905 if (mp2)
906 masks[1] = NULL;
907 while (masks[x]) {
908 hDir = HDIR_CREATE;
909 ulSearchCount = 1;
910 DosError(FERR_DISABLEHARDERR);
911 if (!DosFindFirst(masks[x],
912 &hDir,
913 FILE_ARCHIVED,
914 &findbuf,
915 sizeof(FILEFINDBUF3),
916 &ulSearchCount, FIL_STANDARD)) {
917 do {
918 priority_bumped();
919 WinSendMsg(WinWindowFromID(hwnd,
920 SVBTN_LISTBOX),
921 LM_INSERTITEM,
922 MPFROM2SHORT(LIT_SORTASCENDING, 0),
923 MPFROMP(findbuf.achName));
924 ulSearchCount = 1;
925 } while (!DosFindNext(hDir,
926 &findbuf,
927 sizeof(FILEFINDBUF3), &ulSearchCount));
928 DosFindClose(hDir);
929 priority_bumped();
930 }
931 x++;
932 }
933 DosError(FERR_DISABLEHARDERR);
934 }
935 if (!WinSendDlgItemMsg(hwnd,
936 SVBTN_LISTBOX,
937 LM_QUERYITEMCOUNT, MPVOID, MPVOID)) {
938 WinEnableWindow(WinWindowFromID(hwnd, SVBTN_LISTBOX), FALSE);
939 PostMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
940 }
941 WinSetDlgItemText(hwnd,
942 SVBTN_CURRENT,
943 (*lasttoolbox) ? lasttoolbox : "FM3TOOLS.DAT");
944 break;
945
946 case UM_SETUP:
947 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, SVBTN_ENTRY));
948 return 0;
949
950 case WM_CONTROL:
951 if (SHORT1FROMMP(mp1) == SVBTN_LISTBOX) {
952 SHORT sSelect;
953 CHAR szBuffer[CCHMAXPATH];
954
955 switch (SHORT2FROMMP(mp1)) {
956 case LN_SELECT:
957 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SVBTN_LISTBOX,
958 LM_QUERYSELECTION,
959 MPFROMSHORT(LIT_FIRST), MPVOID);
960 if (sSelect >= 0) {
961 *szBuffer = 0;
962 WinSendDlgItemMsg(hwnd, SVBTN_LISTBOX, LM_QUERYITEMTEXT,
963 MPFROM2SHORT(sSelect, CCHMAXPATH),
964 MPFROMP(szBuffer));
965 if (*szBuffer)
966 WinSetDlgItemText(hwnd, SVBTN_ENTRY, szBuffer);
967 }
968 break;
969
970 case LN_ENTER:
971 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(DID_OK, 0), MPVOID);
972 break;
973 }
974 }
975 return 0;
976
977 case WM_COMMAND:
978 switch (SHORT1FROMMP(mp1)) {
979 case IDM_HELP:
980 if (hwndHelp) {
981 if (INSTDATA(hwnd))
982 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
983 MPFROM2SHORT(HELP_SAVETOOLS, 0),
984 MPFROMSHORT(HM_RESOURCEID));
985 else
986 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
987 MPFROM2SHORT(HELP_LOADTOOLS, 0),
988 MPFROMSHORT(HM_RESOURCEID));
989 }
990 break;
991
992 case DID_CANCEL:
993 WinDismissDlg(hwnd, 0);
994 break;
995
996 case DID_OK:
997 {
998 BOOL saving = WinQueryWindowULong(hwnd, QWL_USER);
999 CHAR temptools[CCHMAXPATH];
1000
1001 strcpy(temptools, lasttoolbox);
1002 if (fToolsChanged)
1003 save_tools(NULL);
1004 WinQueryDlgItemText(hwnd,
1005 SVBTN_ENTRY, sizeof(lasttoolbox), lasttoolbox);
1006 if (*lasttoolbox) {
1007 if (!strchr(lasttoolbox, '.'))
1008 strcat(lasttoolbox, ".TLS");
1009 }
1010 if (saving && *lasttoolbox)
1011 save_tools(NULL);
1012 else {
1013 if (!load_tools(NULL)) {
1014 strcpy(lasttoolbox, temptools);
1015 if (!load_tools(NULL)) {
1016 *lasttoolbox = 0;
1017 load_tools(NULL);
1018 }
1019 }
1020 }
1021 PrfWriteProfileString(fmprof, FM3Str, "LastToolBox", lasttoolbox);
1022 }
1023 WinDismissDlg(hwnd, 1);
1024 break;
1025 }
1026 return 0;
1027 }
1028 return WinDefDlgProc(hwnd, msg, mp1, mp2);
1029}
1030
1031#pragma alloc_text(TOOLS,load_tools,save_tools,add_tool,insert_tool,del_tool,free_tools,swap_tools)
1032#pragma alloc_text(TOOLS,load_quicktools,save_quicktools)
1033#pragma alloc_text(TOOLS1,ReOrderToolsProc,PickToolProc,AddToolProc,ToolIODlgProc)
Note: See TracBrowser for help on using the repository browser.