source: trunk/dll/tools.c@ 1122

Last change on this file since 1122 was 1122, checked in by John Small, 17 years ago

Ticket 267 changes: fix typos, standardize on "Toolbar" over "Toolbox"
and improve/correct wording related to toolbars and toolbar files.

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