source: trunk/dll/tools.c@ 1079

Last change on this file since 1079 was 1079, checked in by Steven Levine, 17 years ago

Avoid some more spurious leak reports

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