source: trunk/dll/tools.c@ 838

Last change on this file since 838 was 838, checked in by Gregg Young, 18 years ago

Remainder of changes for xDosFindFirst/Next wrapper performance test

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