source: trunk/dll/tools.c@ 440

Last change on this file since 440 was 440, checked in by root, 19 years ago

Report more runtime errors

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