source: trunk/dll/tools.c@ 1108

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

Toolbox is saved when a new button is added (Ticket 260)

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