home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 460.lha / 3DPlot_v2.0 / sources / main15.c < prev    next >
C/C++ Source or Header  |  1991-01-04  |  20KB  |  832 lines

  1. /*------------- INCLUDE FILES ----------------*/
  2.  
  3. #include "common.h"
  4.  
  5. /*-------------  DEFINES  ----------------*/
  6.  
  7. /*------------ GLOBAL STRUCTURES -------------*/
  8.  
  9. struct FileRequester *freq;
  10.  
  11. /*------------ EXTERNAL STRUCTURES -------------*/
  12.  
  13. extern struct IntuitionBase *IntuitionBase;
  14. extern struct GfxBase *GfxBase;
  15. extern struct ArpBase *ArpBase;
  16. extern struct ColorBase *ColorBase;
  17. extern struct IFFBase *IFFBase;
  18. extern struct ILBMBase *ILBMBase;
  19.  
  20. extern struct Screen *scr;
  21. extern struct Window *win;
  22. extern struct ViewPort *viewport;
  23. extern struct RastPort *rastport;
  24. extern struct Screen *setscr;
  25. extern struct Window *setwin;
  26. extern struct RastPort *setrastport;
  27. extern struct Menu Menu1;
  28. extern struct Gadget ErrMessageGadg;
  29. extern struct Gadget RotationX;
  30. extern struct Gadget RotationY;
  31. extern struct Gadget RotationZ;
  32. extern struct Gadget EquationD;
  33. extern struct Gadget EquationZ;
  34.  
  35. extern struct Border Border34;
  36. extern struct IntuiText IText93;
  37. #define BorderList Border34
  38. #define ITextList IText93
  39.  
  40.  
  41. /*------------ GLOBAL VARIABLES --------------*/
  42.  
  43. TEXT dirfile[120];
  44. TEXT dirfile3DPL[120];
  45. TEXT colorfile[120];
  46. TEXT dataext[] = ".3DPL";
  47. BOOL fnokay = FALSE;
  48. BOOL titleon = FALSE;
  49. STRPTR InfixEq;
  50. AllPlotData *apd;
  51.  
  52.  
  53. /*----------- EXTERNAL VARIABLES -------------*/
  54.  
  55. extern unsigned char SyntaxErr;  /* For equation input */
  56. extern LONG plottype;     /* How to plot the graph, see menuselect.h */
  57.  
  58.  
  59. /*----------- EXTERNAL FUNCTIONS -------------*/
  60.  
  61.    /* From openclose.c */
  62. extern VOID opendisplay(VOID);
  63. extern VOID openlibraries(VOID);
  64. extern VOID opendisplayset(VOID);
  65. extern LONG loaddisplay(STRPTR);
  66. extern LONG loadcolors(STRPTR);
  67. extern IFFP savecolors(STRPTR);
  68. extern VOID ChangeResolution(UBYTE);
  69. extern VOID finishup(LONG);
  70.    /* From plot.c */
  71. extern VOID DrawGraph(VOID);
  72. extern VOID DrawContour(VOID);
  73. extern VOID SetLoresColors(VOID);
  74. extern VOID ChangePlotParameters(struct Screen *);
  75.    /* From funceval.c */
  76. extern STRPTR Convert(STRPTR);
  77.    /* From Data.c */
  78. extern AllPlotData *AllocAllPlotData(VOID);
  79. extern VOID Init3DPL(AllPlotData *);
  80. extern VOID SetGadgets(struct Gadget *, AllPlotData *);
  81. extern VOID PrintData(AllPlotData *);
  82.  
  83. VOID handleerrmessage(struct Gadget *, STRPTR);
  84.  
  85.  
  86. /*----------- INTERNAL FUNCTIONS -------------*/
  87.  
  88. BOOL handlefilename(VOID)
  89. {
  90. STRPTR temp;
  91.  
  92. if(*(freq->fr_File) == 0)   return FALSE;  /* No filename */
  93.  
  94. dirfile[0] = 0;  /* make null string */
  95. strcpy(dirfile, freq->fr_Dir);
  96. TackOn(dirfile, freq->fr_File);
  97. strcpy(dirfile3DPL, dirfile);
  98. if(strlen(freq->fr_File) > strlen(dataext)) {  /* Filename length > ext. name */
  99.    temp = dirfile + strlen(dirfile) - strlen(dataext);
  100.    if(strcmp(dataext, temp) == 0) {  /* strings equal */
  101.       *temp = 0;    /* Cut off ext. on filename, dirfile3DPL will have ext. */
  102.    }
  103.    else {
  104.       strcat(dirfile3DPL, dataext);  /* add ext. */
  105.    }
  106. }
  107. else {
  108.    strcat(dirfile3DPL, dataext);  /* add ext. */
  109. }
  110. return TRUE;
  111. } /* handlefilename */
  112.  
  113.  
  114. VOID handletemp(code)
  115.    UWORD code;
  116. {
  117.    WBenchToFront();
  118.    printf("Menu num = %u\n", MENUNUM(code));
  119.    printf("Item num = %u\n", ITEMNUM(code));
  120.    printf("Sub num = %u\n\n", SUBNUM(code));
  121.    Delay(150);   /* 3 seconds */
  122.    WBenchToBack();
  123.  
  124. }  /* handletemp */
  125.  
  126.  
  127. VOID handleproject(code)
  128.    UWORD code;
  129. {
  130.    LONG err;
  131.  
  132.    switch(ITEMNUM(code)) {
  133.  
  134.       case PROJECTNEW:
  135.      {  /* Start block */
  136.      STRPTR string = ((struct StringInfo *)(EquationZ.SpecialInfo))->Buffer;
  137.  
  138.      Init3DPL(apd);
  139.      SetGadgets(setwin->FirstGadget, apd);
  140.      InfixEq = Convert(string);
  141.      handleerrmessage(&EquationZ, string);
  142.      }  /* End block */
  143.      break;
  144.  
  145.       case PROJECTOPEN:
  146.      ScreenToFront(setscr);
  147.  
  148.      freq->fr_Hail = "LOAD FILE";
  149.      freq->fr_Window = setwin;
  150.      if (FileRequest(freq)) {
  151.         fnokay = handlefilename();
  152.         if(fnokay) {
  153.            LONG submenu = SUBNUM(code);
  154.  
  155.            if( (submenu == OPENALL) || (submenu == OPENPICTURE) ) {
  156.           err = loaddisplay(dirfile); /* Clears current display first */
  157.           if(err) {
  158.              printf("Error = %d\n", err);
  159.              opendisplay();  /* Open previous display */
  160.           }
  161.            } /* if */
  162.            if( (submenu == OPENALL) || (submenu == OPENSETTINGS) ) {
  163.           err = Read3DPL(dirfile3DPL, apd);
  164.           if(err) {
  165.              printf("Error 3DPL = %d\n", err);
  166.           }
  167.           else {
  168.              STRPTR string = ((struct StringInfo *)(EquationZ.SpecialInfo))->Buffer;
  169.  
  170.              SetGadgets(setwin->FirstGadget, apd);
  171.              InfixEq = Convert(string);
  172.              handleerrmessage(&EquationZ, string);
  173.           }
  174.            } /* if */
  175.         } /* if */
  176.  
  177.         /* ScreenToFront(scr);
  178.         ActivateWindow(win);  */
  179.      } /* if */
  180.      break;
  181.  
  182.       case PROJECTSAVE:
  183.      if(fnokay) {  /* filename OK */
  184.         LONG submenu = SUBNUM(code);
  185.  
  186.         if( (submenu == SAVEALL) || (submenu == SAVEPICTURE) ) {
  187.            ShowTitle(scr, FALSE);  /* Turn off for save */
  188.            err = SaveBitMap(dirfile, rastport->BitMap,
  189.                 viewport->ColorMap->ColorTable, 1);
  190.            if(titleon)  ShowTitle(scr, TRUE);  /* Turn back on */
  191.            if(err == 0L) {
  192.           err = IffError();
  193.           printf("ERROR = %d\n", err);
  194.            } /* if */
  195.         } /* if */
  196.         if( (submenu == SAVEALL) || (submenu == SAVESETTINGS) ) {
  197.            err = Save3DPL(dirfile3DPL, apd);
  198.            if(err) {
  199.           printf("Error 3DPL = %d\n", err);
  200.            }
  201.         } /* if */
  202.      } /* if */
  203.  
  204.      ScreenToFront(setscr);
  205.      ActivateWindow(setwin);
  206.      break;
  207.  
  208.       case PROJECTSAVEAS:
  209.      ScreenToFront(setscr);
  210.      freq->fr_Hail = "SAVE FILE";
  211.      freq->fr_Window = setwin;
  212.      if (FileRequest(freq)) {
  213.         fnokay = handlefilename();
  214.         if(fnokay) {
  215.            LONG submenu = SUBNUM(code);
  216.  
  217.            if( (submenu == SAVEASALL) || (submenu == SAVEASPICTURE) ) {
  218.           ShowTitle(scr, FALSE);  /* Turn off for save */
  219.            /*
  220.           err = SaveBitMap(dirfile, rastport->BitMap,
  221.                    viewport->ColorMap->ColorTable, 1);
  222.            */
  223.           err = (LONG)SaveWindowToIFF(dirfile, win);
  224.           if(titleon)  ShowTitle(scr, TRUE);  /* Turn back on */
  225.           if(err == 0L) {
  226.              err = IffError();
  227.              printf("ERROR = %d\n", err);
  228.           } /* if */
  229.            } /* if */
  230.            if( (submenu == SAVEASALL) || (submenu == SAVEASSETTINGS) ) {
  231.           err = Save3DPL(dirfile3DPL, apd);
  232.           if(err) {
  233.              printf("Error 3DPL = %d\n", err);
  234.           }
  235.            } /* if */
  236.         } /* if */
  237.  
  238.      } /* if */
  239.      ActivateWindow(setwin);
  240.      break;
  241.  
  242.       case PROJECTCOLOR:
  243.      switch((UBYTE)SUBNUM(code)) {
  244.         case COLORADJUST:
  245.            ScreenToFront(scr);
  246.            ActivateWindow(win);
  247.            err = DoColor(NULL, scr);
  248.            break;
  249.         case COLORLOAD:
  250.            { /* Start block */
  251.            struct Window *fwin;
  252.  
  253.            Forbid();
  254.            fwin = IntuitionBase->ActiveWindow;
  255.            Permit();
  256.            ScreenToFront(setscr);
  257.            freq->fr_Hail = "LOAD COLORS";
  258.            freq->fr_Window = setwin;
  259.            if (FileRequest(freq)) {
  260.           if(*(freq->fr_File) != 0) {  /* Filename specified */
  261.              colorfile[0] = 0;    /* make null string */
  262.              strcpy(colorfile, freq->fr_Dir);
  263.              TackOn(colorfile, freq->fr_File);
  264.              err = loadcolors(colorfile);
  265.              if(err) {
  266.             printf("Color load error = %d\n", err);
  267.              }
  268.           } /* if */
  269.            } /* if */
  270.            if(fwin = win) {
  271.           ScreenToFront(scr);
  272.           ActivateWindow(win);
  273.            }
  274.            else {
  275.           ScreenToFront(setscr);
  276.           ActivateWindow(setwin);
  277.            }
  278.            } /* End block */
  279.            break;
  280.         case COLORSAVE:
  281.            ScreenToFront(setscr);
  282.            freq->fr_Hail = "SAVE COLORS";
  283.            freq->fr_Window = setwin;
  284.            if (FileRequest(freq)) {
  285.           if(*(freq->fr_File) != 0) {  /* Filename specified */
  286.              colorfile[0] = 0;    /* make null string */
  287.              strcpy(colorfile, freq->fr_Dir);
  288.              TackOn(colorfile, freq->fr_File);
  289.              err = savecolors(colorfile);
  290.              if(err) {
  291.             printf("Color save error = %d\n", err);
  292.              }
  293.           } /* if */
  294.            } /* if */
  295.            ActivateWindow(setwin);
  296.            break;
  297.         default:
  298.            break;
  299.      } /* switch */
  300.      break;
  301.  
  302.       case PROJECTSCREEN:
  303.      ChangeResolution((UBYTE)SUBNUM(code));
  304.      ChangePlotParameters(scr);
  305.      break;
  306.  
  307.       case PROJECTTITLE:
  308.      if(SUBNUM(code) == TITLEON) {
  309.         ShowTitle(scr, TRUE);
  310.         titleon = TRUE;
  311.      }
  312.      else {
  313.         ShowTitle(scr, FALSE);
  314.         titleon = FALSE;
  315.      }
  316.      break;
  317.  
  318.       case PROJECTQUIT:
  319.      finishup(0L);
  320.      break;
  321.  
  322.       default:
  323.      handletemp(code);
  324.      break;
  325.  
  326.    }  /* switch */
  327.  
  328. }    /* handleproject */
  329.  
  330.  
  331. VOID handlefunction(code)
  332.    UWORD code;
  333. {
  334.    switch(ITEMNUM(code))  {
  335.       case FUNCTIONPLOT:
  336.      plottype = SUBNUM(code);
  337.      ScreenToFront(scr);
  338.      ActivateWindow(win);
  339.      if(plottype == PLOTCONTOUR) {
  340.         DrawContour();
  341.      }
  342.      else {  /* PLOTNORMAL, PLOTHIDDEN, PLOTFILLED */
  343.         DrawGraph();
  344.      }
  345.      break;
  346.       case FUNCTIONSETTINGS:
  347.      ScreenToFront(setscr);
  348.      ActivateWindow(setwin);
  349.      break;
  350.       case FUNCTIONGRAPH:
  351.      ScreenToFront(scr);
  352.      ActivateWindow(win);
  353.      break;
  354.       default:
  355.      handletemp(code);
  356.      break;
  357.    } /* switch */
  358. }  /* handlefunction */
  359.  
  360.  
  361. VOID handletext(code)
  362.    UWORD code;
  363. {
  364.    handletemp(code);
  365. }
  366.  
  367.  
  368. VOID handleerrmessage(gadget, EqBuf)
  369.    struct Gadget *gadget;  /* The equation gadget */
  370.    STRPTR EqBuf;  /* Pointer to equation string buffer */
  371. {
  372.    STRPTR ErrMessage = ErrMessageGadg.GadgetText->IText;
  373.    WORD ErrPosition = 0;
  374.  
  375.    strcpy(ErrMessage, "                                        "); /* 40 */
  376.    RefreshGList(&ErrMessageGadg, setwin, NULL, 1);
  377.  
  378.       /* ERROR STUFF */
  379.  
  380.       if (SyntaxErr) {
  381.      if (SyntaxErr == STACKUNDERFLOW)
  382.         strcpy(ErrMessage,"Stack underflow");
  383.      else if (SyntaxErr == STACKOVERFLOW)
  384.         strcpy(ErrMessage,"Stack overflow");
  385.      else if (SyntaxErr == TOOMANYCONST)
  386.         strcpy(ErrMessage,"Too many constants in function");
  387.      else {
  388.         ErrPosition = InfixEq - EqBuf;
  389.  
  390.         switch (SyntaxErr) {
  391.            case MISPLACEDOP:
  392.           strcpy(ErrMessage,"Misplaced operator");
  393.           break;
  394.            case ILLEGALCHAR:
  395.           strcpy(ErrMessage,"Illegal character");
  396.           break;
  397.            case ILLEGALEXP:
  398.           strcpy(ErrMessage,"Illegal exponent");
  399.           break;
  400.            case ILLEGALFUNC:
  401.           strcpy(ErrMessage,"Illegal function");
  402.           break;
  403.            case MISSINGOP:
  404.           strcpy(ErrMessage,"Missing operator");
  405.           break;
  406.            case MISSINGOPRP:
  407.           strcpy(ErrMessage,"Missing operator or right parenthesis");
  408.           break;
  409.            case MISSINGLP:
  410.           strcpy(ErrMessage,"Missing left parenthesis");
  411.           break;
  412.            case MISSINGRP:
  413.           strcpy(ErrMessage,"Missing right parenthesis");
  414.           break;
  415.            case MISSINGPARM:
  416.           strcpy(ErrMessage,"Missing parameter");
  417.           break;
  418.            case LONEDECIMAL:
  419.           strcpy(ErrMessage,"Lone decimal point");
  420.           break;
  421.            case EXTRADECIMAL:
  422.           strcpy(ErrMessage,"Extra decimal");
  423.           break;
  424.            case EXTRAE:
  425.           strcpy(ErrMessage,"Extra E");
  426.           break;
  427.  
  428.         } /* switch */
  429.  
  430.      } /* else */
  431.  
  432.       } /* if */
  433.  
  434.       else {
  435.      strcpy(ErrMessage, "Acceptable");
  436.       }
  437.  
  438.       ((struct StringInfo *)(gadget->SpecialInfo))->BufferPos = ErrPosition;
  439.       RefreshGList(&ErrMessageGadg, setwin, NULL, 6);
  440.  
  441.       if(SyntaxErr)
  442.      ActivateGadget(gadget, setwin, NULL);  /* For correction */
  443.  
  444. } /* handleerrmessage */
  445.  
  446.  
  447. VOID handleboolgadget(gadget)
  448.    struct Gadget *gadget;
  449. {
  450.    STRPTR gtext;
  451.  
  452.    switch(gadget->GadgetID) {
  453.  
  454.       case SURFACE:
  455.      gtext = gadget->GadgetText->NextText->IText;
  456.      switch(apd->pi.Surface) {
  457.         case XANDY:
  458.            apd->pi.Surface = XONLY;
  459.            strcpy(gtext, "X Only ");
  460.            break;
  461.         case XONLY:
  462.            apd->pi.Surface = YONLY;
  463.            strcpy(gtext, "Y Only ");
  464.            break;
  465.         case YONLY:
  466.            apd->pi.Surface = XANDY;
  467.            strcpy(gtext, "X and Y");
  468.            break;
  469.         default:
  470.            break;
  471.      } /* switch */
  472.      RefreshGList(gadget, setwin, NULL, 1);
  473.      break;
  474.  
  475.       case AXESTYPE:
  476.      gtext = gadget->GadgetText->NextText->IText;
  477.      switch(apd->pi.AxesType) {
  478.         case AXESTYPENONE:
  479.            apd->pi.AxesType = AXESTYPESTAR;
  480.            strcpy(gtext, "Star");
  481.            break;
  482.         case AXESTYPESTAR:
  483.            apd->pi.AxesType = AXESTYPEBOX;
  484.            strcpy(gtext, "Box ");
  485.            break;
  486.         case AXESTYPEBOX:
  487.            apd->pi.AxesType = AXESTYPENONE;
  488.            strcpy(gtext, "None");
  489.            break;
  490.         default:
  491.            break;
  492.      } /* switch */
  493.      RefreshGList(gadget, setwin, NULL, 1);
  494.      break;
  495.  
  496.       case SWAPXYZ:
  497.      {            /* begin block */
  498.      WORD tempTopEdge;
  499.  
  500.      switch(apd->pi.RotationOrder) {
  501.         case ROTATEXYZ:      /* to XZY */
  502.               /* New positions */
  503.            tempTopEdge = RotationY.TopEdge;
  504.            RotationY.TopEdge = RotationZ.TopEdge;
  505.            RotationZ.TopEdge = tempTopEdge;
  506.               /* Reorder gadgets in list */
  507.            RotationY.NextGadget = RotationZ.NextGadget;
  508.            RotationZ.NextGadget = &RotationY;
  509.            RotationX.NextGadget = &RotationZ;
  510.            break;
  511.         case ROTATEXZY:      /* to YXZ */
  512.               /* New positions */
  513.            tempTopEdge = RotationX.TopEdge;
  514.            RotationX.TopEdge = RotationZ.TopEdge;
  515.            RotationZ.TopEdge = RotationY.TopEdge;
  516.            RotationY.TopEdge = tempTopEdge;
  517.               /* Reorder gadgets in list */
  518.            RotationZ.NextGadget = RotationY.NextGadget;
  519.            RotationY.NextGadget = &RotationX;
  520.            EquationD.NextGadget = &RotationY;
  521.            break;
  522.         case ROTATEYXZ:      /* to YZX */
  523.               /* New positions */
  524.            tempTopEdge = RotationX.TopEdge;
  525.            RotationX.TopEdge = RotationZ.TopEdge;
  526.            RotationZ.TopEdge = tempTopEdge;
  527.               /* Reorder gadgets in list */
  528.            RotationX.NextGadget = RotationZ.NextGadget;
  529.            RotationZ.NextGadget = &RotationX;
  530.            RotationY.NextGadget = &RotationZ;
  531.            break;
  532.         case ROTATEYZX:      /* to ZXY */
  533.               /* New positions */
  534.            tempTopEdge = RotationY.TopEdge;
  535.            RotationY.TopEdge = RotationX.TopEdge;
  536.            RotationX.TopEdge = RotationZ.TopEdge;
  537.            RotationZ.TopEdge = tempTopEdge;
  538.               /* Reorder gadgets in list */
  539.            RotationY.NextGadget = RotationX.NextGadget;
  540.            RotationX.NextGadget = &RotationY;
  541.            EquationD.NextGadget = &RotationZ;
  542.            break;
  543.         case ROTATEZXY:      /* to ZYX */
  544.               /* New positions */
  545.            tempTopEdge = RotationX.TopEdge;
  546.            RotationX.TopEdge = RotationY.TopEdge;
  547.            RotationY.TopEdge = tempTopEdge;
  548.               /* Reorder gadgets in list */
  549.            RotationX.NextGadget = RotationY.NextGadget;
  550.            RotationY.NextGadget = &RotationX;
  551.            RotationZ.NextGadget = &RotationY;
  552.            break;
  553.         case ROTATEZYX:      /* to XYZ */
  554.               /* New positions */
  555.            tempTopEdge = RotationX.TopEdge;
  556.            RotationX.TopEdge = RotationZ.TopEdge;
  557.            RotationZ.TopEdge = tempTopEdge;
  558.               /* Reorder gadgets in list */
  559.            RotationZ.NextGadget = RotationX.NextGadget;
  560.            RotationY.NextGadget = &RotationZ;
  561.            RotationX.NextGadget = &RotationY;
  562.            EquationD.NextGadget = &RotationX;
  563.            break;
  564.         default:
  565.            break;
  566.      } /* switch */
  567.      RefreshGList(&EquationD, setwin, NULL, 4);
  568.      apd->pi.RotationOrder = (++(apd->pi.RotationOrder)) % 6;
  569.      } /* end block */
  570.      break;
  571.  
  572.       default:
  573.      break;
  574.  
  575.    } /* switch */
  576.  
  577. } /* handleboolgadget */
  578.  
  579.  
  580. VOID handlestringgadget(gadget, next)
  581.    struct Gadget *gadget;
  582.    BOOL next;
  583. {
  584.    STRPTR string = ((struct StringInfo *)(gadget->SpecialInfo))->Buffer;
  585.    LONG longint = ((struct StringInfo *)(gadget->SpecialInfo))->LongInt;
  586.    DOUBLE number;
  587.  
  588.    if( (gadget->Activation) & LONGINT ) {   /* LONGINT */
  589.  
  590.       switch(gadget->GadgetID) {
  591.      case ROTATIONX:
  592.         apd->dd.RotationX = longint;
  593.         break;
  594.      case ROTATIONY:
  595.         apd->dd.RotationY = longint;
  596.         break;
  597.      case ROTATIONZ:
  598.         apd->dd.RotationZ = longint;
  599.         break;
  600.      case ORIGINX:
  601.         apd->dd.OriginX = longint;
  602.         break;
  603.      case ORIGINY:
  604.         apd->dd.OriginY = longint;
  605.         break;
  606.      default:
  607.         break;
  608.       } /* switch */
  609.  
  610.    } /* if */
  611.  
  612.    else {  /* STRINGS */
  613.  
  614.       number = atof(string);
  615.  
  616.       switch(gadget->GadgetID) {
  617.      case SIZINGPROJPLANE:
  618.         apd->dd.ProjPlane = number;
  619.         break;
  620.      case SIZINGVIEWDIST:
  621.         apd->dd.ViewDist = number;
  622.         break;
  623.      case SIZINGSCALE:
  624.         apd->dd.Scale = number;
  625.         break;
  626.      case LINESPACINGX:
  627.         apd->dd.LineSpacingX = number;
  628.         break;
  629.      case LINESPACINGY:
  630.         apd->dd.LineSpacingY = number;
  631.         break;
  632.      case PLOTSPANXMIN:
  633.         apd->dd.PlotXmin = number;
  634.         break;
  635.      case PLOTSPANXMAX:
  636.         apd->dd.PlotXmax = number;
  637.         break;
  638.      case PLOTSPANYMIN:
  639.         apd->dd.PlotYmin = number;
  640.         break;
  641.      case PLOTSPANYMAX:
  642.         apd->dd.PlotYmax = number;
  643.         break;
  644.      case PLOTPRECISIONX:
  645.         apd->dd.PlotPrecisionX = number;
  646.         break;
  647.      case PLOTPRECISIONY:
  648.         apd->dd.PlotPrecisionY = number;
  649.         break;
  650.      case AXESSPANXMIN:
  651.         apd->ad.AxesXmin = number;
  652.         break;
  653.      case AXESSPANXMAX:
  654.         apd->ad.AxesXmax = number;
  655.         break;
  656.      case AXESSPANYMIN:
  657.         apd->ad.AxesYmin = number;
  658.         break;
  659.      case AXESSPANYMAX:
  660.         apd->ad.AxesYmax = number;
  661.         break;
  662.      case AXESSPANZMIN:
  663.         apd->ad.AxesZmin = number;
  664.         break;
  665.      case AXESSPANZMAX:
  666.         apd->ad.AxesZmax = number;
  667.         break;
  668.      case AXESPRECISION:
  669.         apd->ad.AxesPrecision = number;
  670.         break;
  671.      case EQUATIONZ:
  672.         InfixEq = Convert(string);
  673.         strcpy(apd->ei.Equation, string);
  674.         handleerrmessage(gadget, string);
  675.         break;
  676.      case SETTINGSNOTE:
  677.         strcpy(apd->nt, string);
  678.         break;
  679.      default:
  680.         break;
  681.       } /* switch */
  682.  
  683.       if(gadget->GadgetID >= SIZINGPROJPLANE) {   /* floating point */
  684.      gcvt(number, 10, string);
  685.      RefreshGList(gadget, setwin, NULL, 1);
  686.       }
  687.  
  688.    } /* else */
  689.  
  690.    if(next == TRUE) {  /* Next gadget if switch TRUE */
  691.       BOOL exitflag;
  692.  
  693.       do {
  694.      gadget = gadget->NextGadget;
  695.  
  696.      if(gadget == NULL) {
  697.         exitflag = TRUE;
  698.      }
  699.      else if ( ((gadget->GadgetType) & STRGADGET) &&
  700.              !((gadget->Flags) & GADGDISABLED) ) {
  701.         ActivateGadget(gadget, setwin, NULL);
  702.         exitflag = TRUE;
  703.      }
  704.      else {
  705.         exitflag = FALSE;
  706.      }
  707.  
  708.       } while(exitflag == FALSE);
  709.  
  710.    } /* if */
  711.  
  712. } /* handlestringgadget */
  713.  
  714.  
  715. VOID handlemenu(code)
  716.    UWORD code;
  717. {
  718.    switch(MENUNUM(code)) {
  719.       case MENUPROJECT:
  720.      handleproject(code);
  721.      break;
  722.       case MENUFUNCTION:
  723.      handlefunction(code);
  724.      break;
  725.       case MENUTEXT:
  726.      handletext(code);
  727.      break;
  728.       default:
  729.      break;
  730.    } /* switch */
  731. }   /* handlemenu */
  732.  
  733.  
  734. /*---------------- MAIN PROGRAM ---------------*/
  735.  
  736. VOID main()
  737. {
  738.    struct IntuiMessage *message;
  739.    struct MenuItem *item;
  740.    struct Gadget *gadget;
  741.    struct Gadget *curgadget = NULL;
  742.    ULONG mclass;
  743.    UWORD menunum;
  744.  
  745.    openlibraries();
  746.    opendisplay();
  747.    opendisplayset();
  748.  
  749.    apd = AllocAllPlotData();
  750.    Init3DPL(apd);
  751.    SetGadgets(setwin->FirstGadget, apd);
  752.  
  753.    freq = ArpAllocFreq();  /* Alloc FileRequester Structure */
  754.  
  755.    PrintIText(setrastport, &ITextList, 0, 0);
  756.    DrawBorder(setrastport, &BorderList, 0, 0);
  757.  
  758.    SetLoresColors();
  759.  
  760.    InfixEq = Convert(apd->ei.Equation);
  761.  
  762. #define CheckGadg(x) {if(x) {handlestringgadget(x, FALSE); x = NULL; }}
  763.  
  764.    FOREVER  {
  765.  
  766.       Wait( (1 << win->UserPort->mp_SigBit) | (1 << setwin->UserPort->mp_SigBit) );
  767.  
  768.       while(message = (struct IntuiMessage *) GetMsg(setwin->UserPort)) {
  769.      mclass = message->Class;
  770.      menunum = message->Code;
  771.      gadget = (struct Gadget *) message->IAddress;
  772.      ReplyMsg((struct Message *)message);
  773.  
  774.      switch(mclass) {
  775.         case MENUPICK:
  776.            CheckGadg(curgadget);
  777.            while(menunum != MENUNULL) {
  778.           item = (struct MenuItem *)ItemAddress(&Menu1, menunum);
  779.           handlemenu(menunum);
  780.           menunum = item->NextSelect;
  781.            } /* while */
  782.            break;
  783.  
  784.         case GADGETDOWN:
  785.            CheckGadg(curgadget);
  786.            if(gadget->GadgetType & BOOLGADGET)   /* Boolean */
  787.           handleboolgadget(gadget);
  788.            else
  789.           curgadget = gadget;             /* String */
  790.            break;
  791.  
  792.         case GADGETUP:    /* String */
  793.            handlestringgadget(gadget, TRUE);
  794.            break;
  795.  
  796.         case MOUSEBUTTONS:
  797.         case INACTIVEWINDOW:
  798.            CheckGadg(curgadget);
  799.            break;
  800.  
  801.         default:
  802.            break;
  803.  
  804.      } /* switch */
  805.  
  806.       }  /* while */
  807.  
  808.       while(message = (struct IntuiMessage *) GetMsg(win->UserPort)) {
  809.      mclass = message->Class;
  810.      menunum = message->Code;
  811.      ReplyMsg((struct Message *)message);
  812.  
  813.      switch(mclass) {
  814.         case MENUPICK:
  815.            while(menunum != MENUNULL) {
  816.           item = (struct MenuItem *)ItemAddress(&Menu1, menunum);
  817.           handlemenu(menunum);
  818.           menunum = item->NextSelect;
  819.            } /* while */
  820.            break;
  821.  
  822.         default:
  823.            break;
  824.  
  825.      }  /* switch */
  826.  
  827.       }  /* while */
  828.  
  829.    }  /* FOREVER */
  830.  
  831. }  /* main */
  832.