source: trunk/dll/tools.c@ 766

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

format cleanup

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