source: trunk/dll/tools.c@ 847

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

Removed large file APIs from code where hey are not needed.

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