source: trunk/dll/tools.c@ 793

Last change on this file since 793 was 793, checked in by Gregg Young, 18 years ago

Move #pragma alloc_text to end for OpenWatcom compat

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