source: trunk/dll/tools.c@ 1082

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

Changes so FM2 will use TMP/TEMP directory for all temp files; Replaced save_dir2 with global variable so BldFullPathName could easily replace code that performed the same function; Added #ifdef FORTIFY to free_ function that are only used when fortified.

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