source: trunk/dll/tools.c@ 1118

Last change on this file since 1118 was 1118, checked in by Gregg Young, 17 years ago

Clean up of fix for trap caused by FM/2 being on a full disk. It now preserves the data files. (Ticket 152, 271)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 24.7 KB
RevLine 
[2]1
[123]2/***********************************************************************
3
4 $Id: tools.c 1118 2008-08-24 20:52:23Z gyoung $
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
[1082]20 19 Jul 08 GKY Replace save_dir2(dir) with pFM2SaveDirectory and use BldFullPathName
[123]21
22***********************************************************************/
23
[907]24#include <stdlib.h>
25#include <string.h>
26#include <share.h>
27
[2]28#define INCL_DOS
29#define INCL_WIN
[841]30#define INCL_LONGLONG
[2]31
32#include "fm3dlg.h"
33#include "tools.h"
34#include "fm3str.h"
[907]35#include "errutil.h" // Dos_Error...
36#include "strutil.h" // GetPString
[1082]37#include "pathutil.h" // BldFullPathName
[1079]38#include "fortify.h"
[907]39#include "fm3dll.h"
[2]40
41#pragma data_seg(DATA1)
[329]42
43static PSZ pszSrcFile = __FILE__;
44
[2]45TOOL *toolhead = NULL;
46
[440]47//== load_quicktools() build *.tls array ==
[2]48
[440]49VOID load_quicktools(VOID)
50{
[551]51 FILE *fp;
52 CHAR s[CCHMAXPATH + 14];
53 INT x;
[2]54
55 qtloaded = TRUE;
[440]56 for (x = 0; x < 50 && quicktool[x]; x++) {
[1039]57 free(quicktool[x]);
[2]58 quicktool[x] = NULL;
59 }
[440]60 if (!fToolbar) {
[2]61 qtloaded = FALSE;
62 return;
63 }
[1082]64 BldFullPathName(s, pFM2SaveDirectory, "QUICKTLS.DAT");
[551]65 fp = _fsopen(s, "r", SH_DENYWR);
[329]66 if (fp) {
[440]67 x = 0;
68 while (!feof(fp)) {
[551]69 if (!xfgets_bstripcr(s, CCHMAXPATH + 2, fp, pszSrcFile, __LINE__))
70 break;
[440]71 if (!*s || *s == ';')
[551]72 continue;
[440]73 if (x >= 50) {
74 Runtime_Error(pszSrcFile, __LINE__, "add");
75 break;
[2]76 }
[551]77 quicktool[x] = xstrdup(s, pszSrcFile, __LINE__);
[440]78 if (!quicktool[x])
[551]79 break;
[440]80 x++;
[2]81 }
82 fclose(fp);
83 }
84}
85
[440]86VOID save_quicktools(VOID)
87{
[2]88 FILE *fp;
[551]89 INT x = 0;
90 CHAR s[CCHMAXPATH + 14];
[2]91
[487]92 if (!quicktool[0])
[2]93 return;
[1082]94 BldFullPathName(s, pFM2SaveDirectory, "QUICKTLS.DAT");
[1118]95 if (CheckDriveSpaceAvail(s, ullDATFileSpaceNeeded, 1) == 2)
[1117]96 return; //already gave error msg
[551]97 fp = xfopen(s, "w", pszSrcFile, __LINE__);
[329]98 if (fp) {
[551]99 for (x = 0; quicktool[x] && x < 50; x++)
100 fprintf(fp, "%s\n", quicktool[x]);
[2]101 fclose(fp);
102 }
103}
104
[440]105//== load_tools() Build tools list given .tls filename ==
[2]106
[551]107TOOL *load_tools(CHAR * filename)
[440]108{
[551]109 FILE *fp;
110 CHAR help[80], text[80], flagstr[80], idstr[80], *fname;
111 TOOL *info;
[2]112
[487]113 if (!fToolbar) {
[2]114 toolhead = free_tools();
115 return toolhead;
116 }
[551]117 if (!filename || !*filename)
[2]118 filename = (*lasttoolbox) ? lasttoolbox : "CMDS.TLS";
[487]119 if (*filename)
[2]120 fname = searchpath(filename);
[551]121 if (!fname || !*fname)
[2]122 fname = "FM3TOOLS.DAT";
[551]123 if (fname && *fname) {
[2]124 filename = fname;
[551]125 strcpy(lasttoolbox, filename);
126 fp = _fsopen(filename, "r", SH_DENYWR);
[329]127 if (fp) {
[2]128 toolhead = free_tools();
[487]129 while (!feof(fp)) {
[551]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) {
[1079]146# ifdef FORTIFY
147 Fortify_SetOwner(info, 1);
148 Fortify_SetScope(info, 1);
149# endif
[551]150 if (*help) {
151 literal(help);
[1079]152 if (*help) {
[551]153 info->help = xstrdup(help, pszSrcFile, __LINE__);
[1079]154# ifdef FORTIFY
155 Fortify_SetOwner(info->help, 1);
156 Fortify_SetScope(info->help, 1);
157# endif
158 }
[551]159 }
[1079]160 if (*text) {
[551]161 info->text = xstrdup(text, pszSrcFile, __LINE__);
[1079]162# ifdef FORTIFY
163 Fortify_SetOwner(info->text, 1);
164 Fortify_SetScope(info->text, 1);
165# endif
166 }
[551]167 info->flags = (atoi(flagstr) & (~(T_TEXT | T_EMPHASIZED)));
168 info->id = (USHORT) atoi(idstr);
169 info->next = NULL;
170 add_tool(info);
171 }
[2]172 }
173 fclose(fp);
174 fToolsChanged = FALSE;
175 }
176 }
177 return toolhead;
178}
179
[551]180VOID save_tools(CHAR * filename)
[440]181{
[551]182 FILE *fp;
183 CHAR *fname;
184 TOOL *info;
[2]185
[487]186 if (!filename)
[2]187 filename = lasttoolbox;
[487]188 if (*filename)
[2]189 fname = searchpath(filename);
[487]190 if (fname && *fname)
[2]191 filename = fname;
192 else {
[487]193 if (*lasttoolbox)
[2]194 filename = lasttoolbox;
195 else
196 filename = "FM3TOOLS.TLS";
197 fname = searchpath(filename);
[487]198 if (fname && *fname)
[2]199 filename = fname;
200 }
201
[551]202 if (stristr(filename, "FM3TOOLS.DAT"))
[2]203 filename = "FM3TOOLS.TLS";
[487]204 if (toolhead && filename && *filename) {
[551]205 strcpy(lasttoolbox, filename);
206 PrfWriteProfileString(fmprof, FM3Str, "LastToolBox", filename);
[2]207 }
[487]208 if (!toolhead) {
[551]209 unlinkf("%s", filename);
[2]210 return;
211 }
[1118]212 if (CheckDriveSpaceAvail(filename, ullDATFileSpaceNeeded, 1) == 2)
[1117]213 return; //already gave error msg
[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));
[1108]776 add_tool(tool);
777 save_tools(NULL);
[551]778 WinDismissDlg(hwnd, tool->id);
779 }
780 }
781 break;
[2]782
[551]783 case DID_CANCEL:
784 WinDismissDlg(hwnd, 0);
785 break;
[2]786
[551]787 case ADDBTN_EDITBMP:
788 {
789 CHAR idstr[6], filename[34];
[2]790
[551]791 *idstr = 0;
792 WinQueryDlgItemText(hwnd, ADDBTN_ID, 6, idstr);
793 if (!(USHORT) atoi(idstr)) {
794 DosBeep(250, 100);
795 break;
796 }
797 sprintf(filename, "%u.BMP", atoi(idstr));
798 if (IsFile(filename) != 1) {
799 CHAR s[CCHMAXPATH] = "EMPTY.BMP";
800
801 docopyf(COPY, s, filename);
802 }
803 runemf2(SEPARATE | WINDOWED,
[888]804 hwnd, pszSrcFile, __LINE__,
805 NULL, NULL, "ICONEDIT.EXE %s", filename);
[2]806 }
[551]807 break;
808
809 case IDM_HELP:
810 if (hwndHelp) {
811 if (INSTDATA(hwnd))
812 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
813 MPFROM2SHORT(HELP_CHANGEBUTTON, 0),
814 MPFROMSHORT(HM_RESOURCEID));
815 else
816 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
817 MPFROM2SHORT(HELP_ADDBUTTON, 0),
818 MPFROMSHORT(HM_RESOURCEID));
819 }
820 break;
821 }
822 return 0;
[2]823 }
[551]824 return WinDefDlgProc(hwnd, msg, mp1, mp2);
[2]825}
826
[551]827MRESULT EXPENTRY PickToolProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[440]828{
[487]829 switch (msg) {
[551]830 case WM_INITDLG:
831 if (mp2) {
832 CHAR s[133];
[2]833
[1009]834 sprintf(s, GetPString(IDS_PICKTOOLTITLETEXT), (CHAR *)mp2);
[551]835 WinSetWindowText(hwnd, s);
836 }
837 {
838 TOOL *tool;
839 CHAR s[133];
[2]840
[551]841 tool = toolhead;
842 while (tool) {
843 sprintf(s, "%-5u %s", tool->id, (tool->help) ? tool->help : "?");
844 WinSendDlgItemMsg(hwnd,
845 PICKBTN_LISTBOX,
846 LM_INSERTITEM, MPFROMSHORT(LIT_END), MPFROMP(s));
847 tool = tool->next;
[2]848 }
[551]849 }
850 break;
[2]851
[551]852 case WM_CONTROL:
853 if (SHORT1FROMMP(mp1) == PICKBTN_LISTBOX) {
854 switch (SHORT2FROMMP(mp1)) {
855 case LN_ENTER:
856 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(DID_OK, 0), MPVOID);
857 break;
[2]858 }
[551]859 }
860 return 0;
[2]861
[551]862 case WM_COMMAND:
863 switch (SHORT1FROMMP(mp1)) {
864 case DID_CANCEL:
865 WinDismissDlg(hwnd, 0);
866 break;
867 case DID_OK:
868 {
869 SHORT sSelect;
870 CHAR s[33];
[2]871
[551]872 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, PICKBTN_LISTBOX,
873 LM_QUERYSELECTION,
874 MPFROMSHORT(LIT_FIRST), MPVOID);
875 if (sSelect >= 0) {
876 *s = 0;
877 WinSendDlgItemMsg(hwnd, PICKBTN_LISTBOX, LM_QUERYITEMTEXT,
878 MPFROM2SHORT(sSelect, 32), MPFROMP(s));
879 if (*s)
880 WinDismissDlg(hwnd, (USHORT) atoi(s));
881 }
[2]882 }
[551]883 break;
884 }
885 return 0;
[2]886 }
[551]887 return WinDefDlgProc(hwnd, msg, mp1, mp2);
[2]888}
889
[551]890MRESULT EXPENTRY ToolIODlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[440]891{
[487]892 switch (msg) {
[551]893 case WM_INITDLG:
894 if (mp2)
895 WinSetWindowULong(hwnd, QWL_USER, TRUE);
896 else {
897 WinSetWindowULong(hwnd, QWL_USER, FALSE);
898 WinSetWindowText(hwnd, GetPString(IDS_LOADTOOLBOXTITLETEXT));
899 }
900 WinSendDlgItemMsg(hwnd,
901 SVBTN_ENTRY,
902 EM_SETTEXTLIMIT, MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
903 {
[847]904 FILEFINDBUF3 findbuf;
[551]905 HDIR hDir;
906 ULONG ulSearchCount, x = 0;
907 CHAR *masks[] = { "*.TLS", "FM3TOOLS.DAT", NULL };
908
[487]909 if (mp2)
[551]910 masks[1] = NULL;
911 while (masks[x]) {
912 hDir = HDIR_CREATE;
[766]913 ulSearchCount = 1;
[551]914 DosError(FERR_DISABLEHARDERR);
[847]915 if (!DosFindFirst(masks[x],
916 &hDir,
917 FILE_ARCHIVED,
918 &findbuf,
919 sizeof(FILEFINDBUF3),
920 &ulSearchCount, FIL_STANDARD)) {
[551]921 do {
922 priority_bumped();
923 WinSendMsg(WinWindowFromID(hwnd,
924 SVBTN_LISTBOX),
925 LM_INSERTITEM,
926 MPFROM2SHORT(LIT_SORTASCENDING, 0),
927 MPFROMP(findbuf.achName));
[766]928 ulSearchCount = 1;
[847]929 } while (!DosFindNext(hDir,
930 &findbuf,
931 sizeof(FILEFINDBUF3), &ulSearchCount));
[551]932 DosFindClose(hDir);
933 priority_bumped();
934 }
935 x++;
[2]936 }
[551]937 DosError(FERR_DISABLEHARDERR);
938 }
939 if (!WinSendDlgItemMsg(hwnd,
940 SVBTN_LISTBOX,
941 LM_QUERYITEMCOUNT, MPVOID, MPVOID)) {
942 WinEnableWindow(WinWindowFromID(hwnd, SVBTN_LISTBOX), FALSE);
943 PostMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
944 }
945 WinSetDlgItemText(hwnd,
946 SVBTN_CURRENT,
947 (*lasttoolbox) ? lasttoolbox : "FM3TOOLS.DAT");
948 break;
[2]949
[551]950 case UM_SETUP:
951 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, SVBTN_ENTRY));
952 return 0;
[2]953
[551]954 case WM_CONTROL:
955 if (SHORT1FROMMP(mp1) == SVBTN_LISTBOX) {
956 SHORT sSelect;
957 CHAR szBuffer[CCHMAXPATH];
[2]958
[551]959 switch (SHORT2FROMMP(mp1)) {
960 case LN_SELECT:
961 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SVBTN_LISTBOX,
962 LM_QUERYSELECTION,
963 MPFROMSHORT(LIT_FIRST), MPVOID);
964 if (sSelect >= 0) {
965 *szBuffer = 0;
966 WinSendDlgItemMsg(hwnd, SVBTN_LISTBOX, LM_QUERYITEMTEXT,
967 MPFROM2SHORT(sSelect, CCHMAXPATH),
968 MPFROMP(szBuffer));
969 if (*szBuffer)
970 WinSetDlgItemText(hwnd, SVBTN_ENTRY, szBuffer);
971 }
972 break;
[2]973
[551]974 case LN_ENTER:
975 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(DID_OK, 0), MPVOID);
976 break;
977 }
978 }
979 return 0;
[2]980
[551]981 case WM_COMMAND:
982 switch (SHORT1FROMMP(mp1)) {
983 case IDM_HELP:
984 if (hwndHelp) {
985 if (INSTDATA(hwnd))
986 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
987 MPFROM2SHORT(HELP_SAVETOOLS, 0),
988 MPFROMSHORT(HM_RESOURCEID));
989 else
990 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
991 MPFROM2SHORT(HELP_LOADTOOLS, 0),
992 MPFROMSHORT(HM_RESOURCEID));
[2]993 }
[551]994 break;
[2]995
[551]996 case DID_CANCEL:
997 WinDismissDlg(hwnd, 0);
998 break;
[2]999
[551]1000 case DID_OK:
1001 {
1002 BOOL saving = WinQueryWindowULong(hwnd, QWL_USER);
1003 CHAR temptools[CCHMAXPATH];
[2]1004
[551]1005 strcpy(temptools, lasttoolbox);
1006 if (fToolsChanged)
1007 save_tools(NULL);
1008 WinQueryDlgItemText(hwnd,
1009 SVBTN_ENTRY, sizeof(lasttoolbox), lasttoolbox);
1010 if (*lasttoolbox) {
1011 if (!strchr(lasttoolbox, '.'))
1012 strcat(lasttoolbox, ".TLS");
1013 }
1014 if (saving && *lasttoolbox)
1015 save_tools(NULL);
1016 else {
1017 if (!load_tools(NULL)) {
1018 strcpy(lasttoolbox, temptools);
1019 if (!load_tools(NULL)) {
1020 *lasttoolbox = 0;
1021 load_tools(NULL);
1022 }
1023 }
1024 }
1025 PrfWriteProfileString(fmprof, FM3Str, "LastToolBox", lasttoolbox);
[2]1026 }
[551]1027 WinDismissDlg(hwnd, 1);
1028 break;
1029 }
1030 return 0;
[2]1031 }
[551]1032 return WinDefDlgProc(hwnd, msg, mp1, mp2);
[2]1033}
[793]1034
[1108]1035#pragma alloc_text(TOOLS,load_tools,save_tools,add_tool,insert_tool,del_tool,free_tools,swap_tools)
1036#pragma alloc_text(TOOLS,load_quicktools,save_quicktools)
[793]1037#pragma alloc_text(TOOLS1,ReOrderToolsProc,PickToolProc,AddToolProc,ToolIODlgProc)
Note: See TracBrowser for help on using the repository browser.