source: trunk/dll/tools.c@ 329

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

Check more run time errors

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