source: trunk/dll/tools.c @ 766

Last change on this file since 766 was 766, checked in by Gregg Young, 13 years ago

format cleanup

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