source: trunk/dll/tools.c@ 1131

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

Some additional toolbar enhancements and fixes (tickets 273, 274, 275)

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