source: trunk/dll/tools.c@ 1119

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

Comments for CS 1118 (Tickets 154 (not 152), 270)

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