home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.6 / ffcollection-1-6-1993-02.iso / ff_disks / 571-600 / ff_583 / tpledit / src.lzh / main.c < prev    next >
C/C++ Source or Header  |  1991-12-03  |  27KB  |  1,047 lines

  1.  
  2. /*
  3.  * MAIN.C
  4.  *
  5.  * TPLEDIT [project]
  6.  */
  7.  
  8. #include "defs.h"
  9.  
  10. Prototype void HandleMenu(IMsg *);
  11. Prototype void BoxComplete();
  12. Prototype void Title(char *);
  13. Prototype void TitleState(void);
  14. Prototype void TitleXY(short, short);
  15. Prototype TplRegion *SetCurRegion(TplRegion *);
  16. Prototype void init_test(void);
  17.  
  18. Prototype short QuitCheck(void);
  19. Prototype short do_request(char *, char *, UWORD *);
  20.  
  21. Prototype struct     EasyStruct textreq;
  22. Prototype char       ProjName[256];
  23. Prototype char       ProjSrcName[256];
  24. Prototype char       TmpBuf[256];
  25.  
  26. Prototype Window     *Win;
  27. Prototype Screen     *Scr;
  28. Prototype NewMenu    Nm[];
  29.  
  30. Prototype Gadget     *GList;
  31. Prototype Menu       *GMenu;
  32.  
  33. Prototype List       RegList;
  34. Prototype List       PPList;
  35.  
  36. Prototype TplRegion  *CurRegion;
  37. Prototype short      CurState;
  38.  
  39. Prototype uword      copynum;
  40. Prototype uword      exclnum;
  41. Prototype short      savemain;
  42. Prototype short      issaved;
  43.  
  44. Prototype ProjHeader Ph;
  45.  
  46. Prototype short      NotDone;
  47. Prototype short      DDebug;
  48. Prototype uword      IdNo;
  49. Prototype short      NewType;
  50. Prototype long       NewFlags;
  51. Prototype struct     VisualInfo *VisInfo;
  52.  
  53.  
  54. void   myexit(void);
  55.  
  56. NewMenu Nm[] =
  57. {
  58.   {NM_TITLE, "Project"},
  59.   {NM_ITEM,  "Save",        NULL, 0, 0, MENU_PROJ_SAVE},
  60.   {NM_ITEM,  "SaveC",       NULL, 0, 0, MENU_PROJ_SAVESRC},
  61.   {NM_SUB,   "Excl Main()", NULL, 0, 0, MENU_PROJ_SAVEMAINNO},
  62.   {NM_SUB,   "Incl Main()", NULL, 0, 0, MENU_PROJ_SAVEMAINYES},
  63.   {NM_ITEM,  "SaveAs",      NULL, 0, 0, MENU_PROJ_SAVEAS},
  64.   {NM_ITEM,  "SaveAsC",     NULL, 0, 0, MENU_PROJ_SAVEASSRC},
  65.   {NM_SUB,   "Excl Main()", NULL, 0, 0, MENU_PROJ_SAVEASMAINNO},
  66.   {NM_SUB,   "Incl Main()", NULL, 0, 0, MENU_PROJ_SAVEASMAINYES},
  67.   {NM_ITEM,  "Load",        NULL, 0, 0, MENU_PROJ_LOAD},
  68.   {NM_ITEM,  "Merge",       NULL, 0, 0, MENU_PROJ_MERGE},
  69.   {NM_ITEM,  "Quit",        NULL, 0, 0, MENU_PROJ_QUIT},
  70.  
  71.  
  72.   {NM_TITLE, "Gadgets"},
  73.   {NM_ITEM,  "Invisible", NULL, CHECKIT|CHECKED, GADGET_EXCL - 1, MENU_GADGET},
  74.   {NM_ITEM,  "Button",    NULL, CHECKIT, GADGET_EXCL -     2, MENU_GADGET +  1},
  75.   {NM_ITEM,  "CheckBox",  NULL, CHECKIT, GADGET_EXCL -     4, MENU_GADGET +  2},
  76.   {NM_ITEM,  "Integer",   NULL, CHECKIT, GADGET_EXCL -     8, MENU_GADGET +  3},
  77.   {NM_ITEM,  "ListView",  NULL, CHECKIT, GADGET_EXCL -    16, MENU_GADGET +  4},
  78.   {NM_ITEM,  "MutualeXcl",NULL, CHECKIT, GADGET_EXCL -    32, MENU_GADGET +  5},
  79.   {NM_ITEM,  "Number",    NULL, CHECKIT, GADGET_EXCL -    64, MENU_GADGET +  6},
  80.   {NM_ITEM,  "Cycle",     NULL, CHECKIT, GADGET_EXCL -   128, MENU_GADGET +  7},
  81.   {NM_ITEM,  "Palette",   NULL, CHECKIT, GADGET_EXCL -   256, MENU_GADGET +  8},
  82.   {NM_ITEM,  "Scroller",  NULL, CHECKIT, GADGET_EXCL -   512, MENU_GADGET +  9},
  83.   {NM_ITEM,  "Border",    NULL, CHECKIT, GADGET_EXCL -  1024, MENU_GADGET + 10},
  84.   {NM_ITEM,  "Slider",    NULL, CHECKIT, GADGET_EXCL -  2048, MENU_GADGET + 11},
  85.   {NM_ITEM,  "String",    NULL, CHECKIT, GADGET_EXCL -  4096, MENU_GADGET + 12},
  86.   {NM_ITEM,  "Text",      NULL, CHECKIT, GADGET_EXCL -  8192, MENU_GADGET + 13},
  87.  
  88.   {NM_TITLE, "Edit"},
  89.   {NM_ITEM,  "LockLinkTo",  NULL, 0, 0, MENU_EDIT_LOCK},
  90.   {NM_ITEM,  "UnLockLink",  NULL, 0, 0, MENU_EDIT_UNLOCK},
  91.   {NM_ITEM,  "SortRegions", NULL, 0, 0, MENU_EDIT_SORT},
  92.  
  93.   {NM_TITLE, "Snap"},
  94.   {NM_ITEM,   "1",  NULL, CHECKIT|CHECKED, SNAP_EXCL - 1, MENU_SNAP + 1},
  95.   {NM_ITEM,   "2",  NULL, CHECKIT, SNAP_EXCL -    2, MENU_SNAP +  2},
  96.   {NM_ITEM,   "4",  NULL, CHECKIT, SNAP_EXCL -    4, MENU_SNAP +  4},
  97.   {NM_ITEM,   "6",  NULL, CHECKIT, SNAP_EXCL -    8, MENU_SNAP +  6},
  98.   {NM_ITEM,   "8",  NULL, CHECKIT, SNAP_EXCL -   16, MENU_SNAP +  8},
  99.   {NM_ITEM,  "10",  NULL, CHECKIT, SNAP_EXCL -   32, MENU_SNAP + 10},
  100.   {NM_ITEM,  "12",  NULL, CHECKIT, SNAP_EXCL -   64, MENU_SNAP + 12},
  101.   {NM_ITEM,  "14",  NULL, CHECKIT, SNAP_EXCL -  128, MENU_SNAP + 14},
  102.   {NM_ITEM,  "16",  NULL, CHECKIT, SNAP_EXCL -  256, MENU_SNAP + 16},
  103.   {NM_ITEM,  "18",  NULL, CHECKIT, SNAP_EXCL -  512, MENU_SNAP + 18},
  104.   {NM_ITEM,  "20",  NULL, CHECKIT, SNAP_EXCL - 1024, MENU_SNAP + 20},
  105.  
  106.   {NM_END}
  107. };
  108.  
  109. char      ProjName[256];
  110. char      ProjSrcName[256];
  111. char      TitleBuf[256];
  112. char      TmpBuf[256];
  113.  
  114. Window    *Win;
  115. Screen    *Scr;
  116. Gadget    *GList;
  117. Menu      *GMenu;
  118. struct    VisualInfo *VisInfo;
  119.  
  120. List      RegList;
  121. List      PPList;
  122.  
  123. TplRegion *CurRegion;
  124. short     CurState = STATE_TEST;
  125. short     ButState;
  126.  
  127. short     DDebug;
  128.  
  129. short     CoorSnap = 1;
  130.  
  131. uword     IdNo;
  132.  
  133. short     NewType  = 0;
  134. long      NewFlags = 1L << 4;   /* in */
  135.  
  136. uword     copynum  = 1;
  137. uword     exclnum  = 0;
  138. short     savemain = FALSE;
  139. short     issaved  = TRUE;
  140.  
  141. long      WinMask;
  142.  
  143. ProjHeader Ph;
  144.  
  145. short     NotDone = 1;
  146. Box       TBox;
  147. short     TX, TY;
  148.  
  149. /***********************  main **********************************/
  150.  
  151. main(ac, av)
  152.   int   ac;
  153.   char  *av[];
  154. {
  155.   short  i;
  156.  
  157.   NewList(&RegList);
  158.   NewList(&PPList);
  159.  
  160.   atexit(myexit);
  161.  
  162.   for (i = 1; i < ac; ++i)
  163.   {
  164.     char  *ptr = av[i];
  165.  
  166.     if (*ptr != '-')
  167.     {
  168.       strcpy(ProjName, ptr);
  169.       continue;
  170.     }
  171.     ptr += 2;
  172.     switch (ptr[-1])
  173.     {
  174.     case 'd':
  175.       ++DDebug;
  176.     default:
  177.       break;
  178.     }
  179.   }
  180.  
  181.   if ((Scr     = LockPubScreen(NULL)) == NULL)
  182.     exit(20);
  183.  
  184.   if ((VisInfo = GetVisualInfo(Scr, TAG_END)) == NULL)
  185.     exit(22);
  186.  
  187.   if ((GMenu   = CreateMenus(Nm, GTMN_Menu, 1, TAG_END)) == NULL)
  188.     exit(24);
  189.  
  190.   if (LayoutMenus(GMenu, VisInfo, TAG_END) == 0)
  191.     exit(25);
  192.  
  193.  
  194.   short yoffset =  Scr->Height - 200;
  195.  
  196.  
  197.   Ph.ph_WinDim.bo_Xs    =   0;
  198.   Ph.ph_WinDim.bo_Ys    =   (yoffset > 200) ? 200 : yoffset;
  199.   Ph.ph_WinDim.bo_Xe    = 200;
  200.   Ph.ph_WinDim.bo_Ye    = Ph.ph_WinDim.bo_Ys + 200;
  201.   Ph.ph_MinMaxDim.bo_Xs =  32;
  202.   Ph.ph_MinMaxDim.bo_Ys =  32;
  203.   Ph.ph_MinMaxDim.bo_Xe =  -1;
  204.   Ph.ph_MinMaxDim.bo_Ye =  -1;
  205.  
  206.   if (OpenEditWindow() < 0)
  207.     exit(26);
  208.   if (DDebug)
  209.     puts("done OpenEditWindow");
  210.  
  211.  
  212.   if (ProjName[0] == 0)
  213.     strcpy(ProjName, "unnamed");
  214.   else
  215.     LoadProject(ProjName);
  216.  
  217.   MakeAllGadgets();
  218.   if (DDebug)
  219.     puts("done MakeAllGadgets");
  220.  
  221. /*
  222.  * Open Window
  223.  */
  224.  
  225.   Win = OpenWindowTags(NULL,
  226.                        WA_Flags,             WFLG_DRAGBAR |
  227.                                              WFLG_DEPTHGADGET |
  228.                                              WFLG_CLOSEGADGET |
  229.                                              WFLG_SIMPLE_REFRESH |
  230.                                              WFLG_REPORTMOUSE |
  231.                                              WFLG_SIZEGADGET,
  232.  
  233.                        WA_IDCMP,             IDCMP_NEWSIZE |
  234.                                              IDCMP_MOUSEBUTTONS |
  235.                                              IDCMP_GADGETDOWN |
  236.                                              IDCMP_GADGETUP |
  237.                                              IDCMP_MENUPICK |
  238.                                              IDCMP_VANILLAKEY |
  239.                                              IDCMP_RAWKEY |
  240.                                              IDCMP_CHANGEWINDOW |
  241.                                              IDCMP_CLOSEWINDOW |
  242.                                              IDCMP_REFRESHWINDOW |
  243.                                              IDCMP_MOUSEMOVE |
  244.                                              IDCMP_ACTIVEWINDOW,
  245.  
  246.                        WA_Left,              Ph.ph_WinDim.bo_Xs,
  247.                        WA_Top,               Ph.ph_WinDim.bo_Ys,
  248.                        WA_Width,             Ph.ph_WinDim.bo_Xe - Ph.ph_WinDim.bo_Xs,
  249.                        WA_Height,            Ph.ph_WinDim.bo_Ye - Ph.ph_WinDim.bo_Ys,
  250.                        WA_Title,             ProjName,
  251.                        WA_MinWidth,          Ph.ph_MinMaxDim.bo_Xs,
  252.                        WA_MinHeight,         Ph.ph_MinMaxDim.bo_Ys,
  253.                        WA_MaxWidth,          Ph.ph_MinMaxDim.bo_Xe,
  254.                        WA_MaxHeight,         Ph.ph_MinMaxDim.bo_Ye,
  255.                        WA_AutoAdjust,        1,
  256.                        WA_PubScreen,         NULL,
  257.                        WA_PubScreenFallBack, 1,
  258.                        WA_Gadgets,           GList,
  259.                        TAG_END);
  260.  
  261.   if (Win == NULL)
  262.     exit(27);
  263.   if (DDebug)
  264.     puts("done OpenWinWindow");
  265.  
  266.   WinMask = 1 << Win->UserPort->mp_SigBit;
  267.  
  268.   SetMenuStrip(Win, GMenu);
  269.  
  270.   if (DDebug)
  271.     puts("done SetMenuStrip");
  272.   Title("TPLEDIT 1.0 PUBLIC DOMAIN, Matthew Dillon");
  273.  
  274. /*
  275.  * Main Loop
  276.  */
  277.  
  278.   EnableGadgets();
  279.   if (DDebug)
  280.     puts("done EnableGadgets");
  281.  
  282.   GT_RefreshWindow(Win, NULL);
  283.  
  284.   while (NotDone)
  285.   {
  286.     if (DDebug)
  287.       puts("looping");
  288.     IMsg  *im;
  289.     long   mask;
  290.  
  291.     mask = Wait(WinMask |
  292.                 EWinMask |
  293.                 SIGBREAKF_CTRL_C |
  294.                 SIGBREAKF_CTRL_E |
  295.                 SIGBREAKF_CTRL_F);
  296.  
  297.     if (mask & SIGBREAKF_CTRL_C)
  298.       NotDone = 0;
  299.  
  300.     if (Win)
  301.     {
  302.       while (im = GT_GetIMsg(Win->UserPort))
  303.       {
  304.         if (DDebug)
  305.           puts("Win");
  306.         short  saveX = im->MouseX;
  307.         short  saveY = im->MouseY;
  308.  
  309.         im->MouseX = (saveX + (CoorSnap >> 1)) / CoorSnap * CoorSnap;
  310.         im->MouseY = (saveY + (CoorSnap >> 1)) / CoorSnap * CoorSnap;
  311.  
  312.         if (DDebug &&
  313.             im->Class != IDCMP_MOUSEMOVE &&
  314.             im->Class != IDCMP_INTUITICKS)
  315.           printf("CLASS %08lx CODE %d IA=%08lx\n",
  316.                   im->Class, im->Code, im->IAddress);
  317.  
  318.         switch (im->Class)
  319.         {
  320.         case IDCMP_ACTIVEWINDOW:
  321.           ClearMenuStrip(EWin);
  322.           SetMenuStrip(Win, GMenu);
  323.           break;
  324.  
  325.         case IDCMP_CHANGEWINDOW:
  326.           Ph.ph_WinDim.bo_Xs = Win->LeftEdge;
  327.           Ph.ph_WinDim.bo_Ys = Win->TopEdge;
  328.           Ph.ph_WinDim.bo_Xe = Win->LeftEdge + Win->Width;
  329.           Ph.ph_WinDim.bo_Ye = Win->TopEdge  + Win->Height;
  330.           break;
  331.  
  332.         case IDCMP_CLOSEWINDOW:
  333.           NotDone = QuitCheck();
  334.           break;
  335.  
  336.         case IDCMP_REFRESHWINDOW:
  337.           GT_BeginRefresh(Win);
  338.  
  339.           TplRegion *rg;
  340.           for (rg = GetHead(&RegList); rg; rg = GetSucc(&rg->rg_Node))
  341.           {
  342.             if (rg->rg_Type == RGT_BEVELBOX)
  343.             {
  344.               short leftedge   = rg->rg_Box.bo_Xs;
  345.               short topedge    = rg->rg_Box.bo_Ys;
  346.               short width      = rg->rg_Box.bo_Xe - rg->rg_Box.bo_Xs + 1;
  347.               short height     = rg->rg_Box.bo_Ye - rg->rg_Box.bo_Ys + 1;
  348.               DrawBevelBox(Win->RPort, leftedge, topedge, width, height,
  349.                             GT_VisualInfo, VisInfo,
  350.                             ((rg->rg_SpecFlags & SPEC_RECESSED) ?
  351.                                              GTBB_Recessed : TAG_IGNORE), TRUE,
  352.                             TAG_END);
  353.             }
  354.           }
  355.  
  356.           GT_EndRefresh(Win, TRUE);
  357.           break;
  358.  
  359.         case IDCMP_GADGETDOWN:
  360.         case IDCMP_GADGETUP:
  361.           if (SetCurRegion(FindRegionByGad((Gadget *) im->IAddress)))
  362.           {
  363.             UpdateEWinInfo(CurRegion);
  364.             TitleState();
  365.             if (CurState == STATE_TEST)
  366.             {
  367.               if ((CurRegion->rg_ExclGroup) ||
  368.                   (CurRegion->rg_SpecFlags & SPEC_CHECKED))
  369.               {
  370.                 Gadget *gad = CurRegion->rg_Gad;
  371.                 switch (CurRegion->rg_Type)
  372.                 {
  373.                 case RGT_BUTTON:
  374.                 case RGT_CHECKBOX:
  375.                   selectgad(gad, CurRegion->rg_Type);
  376.                   break;
  377.  
  378.                 case RGT_STRING:
  379.                 case RGT_LISTVIEW:
  380.                 case RGT_CYCLE:
  381.                 case RGT_INTEGER:
  382.                 case RGT_SLIDER:
  383.                   DisableExcl(gad);
  384.  
  385.                 default:
  386.                   break;
  387.                 }
  388.               }
  389.             }
  390.           }
  391.           break;
  392.  
  393.         case IDCMP_MENUPICK:
  394.           HandleMenu(im);
  395.           break;
  396.  
  397.         case IDCMP_MOUSEBUTTONS:
  398.           switch (im->Code)
  399.           {
  400.           case SELECTDOWN:
  401.             switch (CurState)
  402.             {
  403.             case STATE_UNLINKREGION:
  404.               if (CurRegion && (CurRegion->rg_Type == RGT_LISTVIEW))
  405.               {
  406.                 UnLink(CurRegion);
  407.                 ReMakeEverything();
  408.                 Title("UnLink Successful");
  409.                 init_test();
  410.               }
  411.               break;
  412.  
  413.             case STATE_LINKREGION:
  414.               if (CurRegion && (CurRegion->rg_Type == RGT_LISTVIEW))
  415.               {
  416.                 TplRegion *tr;
  417.  
  418.                 if (tr = FindRegion(saveX, saveY))
  419.                 {
  420.                   if (tr->rg_Type == RGT_STRING)
  421.                   {
  422.                     CurRegion->rg_LockedTo = tr;
  423.                     tr->rg_LockedTo  = CurRegion;
  424.  
  425.                     tr->rg_Box.bo_Xs = CurRegion->rg_Box.bo_Xs;
  426.                     tr->rg_Box.bo_Xe = CurRegion->rg_Box.bo_Xe;
  427.                     tr->rg_Box.bo_Ys = CurRegion->rg_Box.bo_Ye + 1;
  428.                     tr->rg_Box.bo_Ye = tr->rg_Box.bo_Ys + 15;
  429.                     ReMakeEverything();
  430.                     Title("Link Successful");
  431.                     init_test();
  432.                     break;
  433.                   }
  434.                 }
  435.               }
  436.               Title("Link failed !");
  437.               break;
  438.  
  439.             case STATE_EXCLREGION:
  440.               if (CurRegion && CurRegion->rg_Type)
  441.               {
  442.                 TplRegion *tr;
  443.  
  444.                 if (tr = FindRegion(saveX, saveY))
  445.                 {
  446.                   if (tr == CurRegion)
  447.                   {
  448.                     tr->rg_ExclGroup = 0;
  449.                   }
  450.                   else
  451.                   {
  452.                     if (!CurRegion->rg_ExclGroup)
  453.                       CurRegion->rg_ExclGroup = 1L << exclnum++;
  454.  
  455.                     tr->rg_ExclGroup |= CurRegion->rg_ExclGroup;
  456.                   }
  457.                   init_test();
  458.                 }
  459.               }
  460.               break;
  461.  
  462.             case STATE_NEWREGION:
  463.               TBox.bo_Xs = TBox.bo_Xe = im->MouseX;
  464.               TBox.bo_Ys = TBox.bo_Ye = im->MouseY;
  465.               DrawBox(&TBox);
  466.               TitleState();
  467.               ButState |= 4;
  468.  
  469.             default:
  470.               break;
  471.             }
  472.  
  473.             if ((CurState != STATE_LINKREGION) &&
  474.                 (SetCurRegion(FindRegion(saveX, saveY))))
  475.             {
  476.               switch (CurState)
  477.               {
  478.               case STATE_DELREGION:
  479.                 DeleteTplRegion(CurRegion);
  480.                 ReMakeEverything();
  481.                 Title("Test Gadgets");
  482.                 init_test();
  483.                 break;
  484.  
  485.               case STATE_COPYREGION:
  486.                 UpdateEWinInfo(CurRegion);
  487.                 TitleState();
  488.  
  489.                 TBox = CurRegion->rg_Box;
  490.                 sprintf(Buf_region_str, "%s_%d", CurRegion->rg_Node.ln_Name, copynum);
  491.                 ++copynum;
  492.  
  493.                 TplRegion *tr = CurRegion;
  494.  
  495.                 BoxComplete();
  496.  
  497.                 SetCurRegion(tr);
  498.                 CurState  = STATE_MOVEREGION;
  499.                 GT_SetGadgetAttrs(Gad_actions_mx, EWin, NULL,
  500.                                   GTMX_Active, ACT_MOVE,
  501.                                   TAG_END);
  502.                 Title("Move Copy to New Place");
  503.  
  504.               case STATE_SIZEREGION:
  505.               case STATE_MOVEREGION:
  506.                 TX = im->MouseX;
  507.                 TY = im->MouseY;
  508.                 UpdateEWinInfo(CurRegion);
  509.  
  510.                 short ok = FALSE;
  511.                 switch(CurRegion->rg_Type)
  512.                 {
  513.                 case RGT_CHECKBOX:
  514.                   if (CurState == STATE_SIZEREGION)
  515.                     break;
  516.                   CurRegion->rg_Box.bo_Xe = CurRegion->rg_Box.bo_Xs + 25;
  517.                   CurRegion->rg_Box.bo_Ye = CurRegion->rg_Box.bo_Ys + 10;
  518.                   ok = TRUE;
  519.                   break;
  520.  
  521.                 case RGT_MX:
  522.                   if (CurState == STATE_SIZEREGION)
  523.                     break;
  524.                   CurRegion->rg_Box.bo_Xe = CurRegion->rg_Box.bo_Xs + 16;
  525.                   CurRegion->rg_Box.bo_Ye = CurRegion->rg_Box.bo_Ys +  8;
  526.                   ok = TRUE;
  527.                   break;
  528.  
  529.                 case RGT_STRING:
  530.                   if (CurRegion->rg_LockedTo)
  531.                     break;
  532.  
  533.                 default:
  534.                   ok = TRUE;
  535.                   break;
  536.                 }
  537.                 if (ok)
  538.                 {
  539.                   TBox = CurRegion->rg_Box;
  540.                   DrawBox(&TBox);
  541.                   TitleState();
  542.                   ButState |= 4;
  543.                 }
  544.                 break;
  545.  
  546.               case STATE_TEST:
  547.                 UpdateEWinInfo(CurRegion);
  548.                 TitleState();
  549.  
  550.               default:
  551.                 break;
  552.               }
  553.             }
  554.  
  555.             ButState |= 1;
  556.             break;
  557.  
  558.           case SELECTUP:
  559.             if (ButState & 4)
  560.             {
  561.               DrawBox(&TBox);
  562.               TitleState();
  563.  
  564.               switch (CurState)
  565.               {
  566.               case STATE_NEWREGION:
  567.                 TBox.bo_Xe = im->MouseX;
  568.                 TBox.bo_Ye = im->MouseY;
  569.                 break;
  570.  
  571.               case STATE_MOVEREGION:
  572.                 TBox.bo_Xs += im->MouseX - TX;
  573.                 TBox.bo_Xe += im->MouseX - TX;
  574.                 TBox.bo_Ys += im->MouseY - TY;
  575.                 TBox.bo_Ye += im->MouseY - TY;
  576.                 break;
  577.  
  578.               case STATE_SIZEREGION:
  579.                 TBox.bo_Xe += im->MouseX - TX;
  580.                 TBox.bo_Ye += im->MouseY - TY;
  581.                 break;
  582.  
  583.               case STATE_TEST  :
  584.               default:
  585.                 break;
  586.               }
  587.               FixBounds(&TBox);
  588.               BoxComplete();
  589.             }
  590.             ButState &= ~(1 | 4);
  591.             break;
  592.  
  593.           case MENUDOWN:
  594.             ButState |= 2;
  595.             break;
  596.  
  597.           case MENUUP:
  598.             ButState &= ~2;
  599.             break;
  600.  
  601.           default:
  602.             break;
  603.  
  604.           }
  605.           break;
  606.  
  607.         case IDCMP_MOUSEMOVE:
  608.           if (ButState & 4)
  609.           {
  610.             DrawBox(&TBox);
  611.  
  612.             switch (CurState)
  613.             {
  614.             case STATE_NEWREGION:
  615.               TBox.bo_Xe = im->MouseX;
  616.               TBox.bo_Ye = im->MouseY;
  617.               break;
  618.  
  619.             case STATE_MOVEREGION:
  620.               TBox.bo_Xs += im->MouseX - TX;
  621.               TBox.bo_Xe += im->MouseX - TX;
  622.               TBox.bo_Ys += im->MouseY - TY;
  623.               TBox.bo_Ye += im->MouseY - TY;
  624.               break;
  625.  
  626.             case STATE_SIZEREGION:
  627.               TBox.bo_Xe += im->MouseX - TX;
  628.               TBox.bo_Ye += im->MouseY - TY;
  629.               break;
  630.  
  631.             default:
  632.               break;
  633.             }
  634.             TX = im->MouseX;
  635.             TY = im->MouseY;
  636.             DrawBox(&TBox);
  637.             TitleState();
  638.           }
  639.           break;
  640.  
  641.         default:
  642.           break;
  643.  
  644.         }
  645.         im->MouseX = saveX;
  646.         im->MouseY = saveY;
  647.         GT_ReplyIMsg(im);
  648.       }
  649.     }
  650.     if (EWin)
  651.     {
  652.       while (im = GT_GetIMsg(EWin->UserPort))
  653.       {
  654.         if (DDebug)
  655.           puts("EWin");
  656.         if (DDebug && im->Class != IDCMP_MOUSEMOVE)
  657.           printf("CLASS %08lx CODE %d IA=%08lx\n",
  658.                   im->Class, im->Code, im->IAddress);
  659.  
  660.         switch (im->Class)
  661.         {
  662.         case IDCMP_ACTIVEWINDOW:
  663.           if (DDebug)
  664.             puts("IDCMP_ACTIVEWINDOW");
  665.           ClearMenuStrip(Win);
  666.           SetMenuStrip(EWin, GMenu);
  667.           break;
  668.  
  669.         case IDCMP_CLOSEWINDOW:
  670.           if (DDebug)
  671.             puts("IDCMP_CLOSEWINDOW");
  672.           NotDone = QuitCheck();
  673.           break;
  674.  
  675.         case IDCMP_REFRESHWINDOW:
  676.           if (DDebug)
  677.             puts("IDCMP_REFRESHWINDOW");
  678.           GT_BeginRefresh(EWin);
  679.           GT_EndRefresh(EWin, TRUE);
  680.           drawborders();
  681.           break;
  682.  
  683.         case IDCMP_MENUPICK:
  684.           if (DDebug)
  685.             puts("IDCMP_MENUPICK");
  686.           HandleMenu(im);
  687.           break;
  688.  
  689.         case IDCMP_GADGETDOWN:
  690.         case IDCMP_GADGETUP:
  691.           if (DDebug)
  692.             puts("IDCMP_GADGETUP/DOWN");
  693.           HandleEditGadget(im);
  694.           break;
  695.  
  696.         case IDCMP_MOUSEMOVE:
  697.           if (DDebug)
  698.             puts("IDCMP_MOUSEMOVE");
  699.           HandleSliders(im);
  700.           break;
  701.  
  702.         default:
  703.           if (DDebug)
  704.             printf("default:\nCLASS %08lx CODE %d IA=%08lx\n",
  705.                   im->Class, im->Code, im->IAddress);
  706.           break;
  707.  
  708.         }
  709.         GT_ReplyIMsg(im);
  710.       }
  711.     }
  712.   }
  713.   return (0);
  714. }
  715.  
  716. /***********************  myexit(void)  ******************************/
  717. void
  718. myexit(void)
  719. {
  720.   if (Win)
  721.   {
  722.     ClearMenuStrip(Win);
  723.     CloseWindow(Win);
  724.   }
  725.   CloseEditWindow();
  726.   if (GList)
  727.     FreeGadgets(GList);
  728.   if (GMenu)
  729.     FreeMenus(GMenu);
  730.   if (VisInfo)
  731.     FreeVisualInfo(VisInfo);
  732.   if (Scr)
  733.     UnlockPubScreen(NULL, Scr);
  734. }
  735.  
  736. /***********************  BoxComplete(void) **************************/
  737. void
  738. BoxComplete(void)
  739. {
  740.   switch (CurState)
  741.   {
  742.   case STATE_NEWREGION:
  743.     short  dx = TBox.bo_Xe - TBox.bo_Xs;
  744.     short  dy = TBox.bo_Ye - TBox.bo_Ys;
  745.  
  746.     if ((dx < 5 && dy < 5) || dx < 3 || dy < 3)
  747.       return;
  748.                           /*  fall through */
  749.     if (Buf_region_str[0] == 0)
  750.     {
  751.       if (DDebug)
  752.         puts("no region name");
  753.       return;
  754.     }
  755.  
  756.   case STATE_COPYREGION:
  757.  
  758.     DrawBox(&TBox);
  759.  
  760.     TplRegion *rg = AllocTplRegion();
  761.  
  762.     UpdateTplRegion(rg);
  763.  
  764.     switch(rg->rg_Type)
  765.     {
  766.     case RGT_CHECKBOX:
  767.       TBox.bo_Xe = TBox.bo_Xs + 25;
  768.       TBox.bo_Ye = TBox.bo_Ys + 10;
  769.       break;
  770.  
  771.     case RGT_MX:
  772.       TBox.bo_Xe = TBox.bo_Xs + 16;
  773.       TBox.bo_Ye = TBox.bo_Ys +  8;
  774.  
  775.     default:
  776.       break;
  777.     }
  778.  
  779.     rg->rg_Box = TBox;
  780.  
  781.     rg->rg_MinMax.bo_Xs = rg->rg_MinMax.bo_Xe = TBox.bo_Xe - TBox.bo_Xs;
  782.     rg->rg_MinMax.bo_Ys = rg->rg_MinMax.bo_Ye = TBox.bo_Ye - TBox.bo_Ys;
  783.  
  784.     SetCurRegion(rg);
  785.     UpdateEWinInfo(CurRegion);
  786.     ReMakeEverything();
  787.  
  788.     break;
  789.  
  790.   case STATE_MOVEREGION:
  791.     if (CurRegion)
  792.     {
  793.       CurRegion->rg_Box = TBox;
  794.       ReMakeEverything();
  795.     }
  796.     break;
  797.  
  798.   case STATE_SIZEREGION:
  799.     if (CurRegion)
  800.     {
  801.       if ((CurRegion->rg_Type != RGT_CHECKBOX) &&
  802.           (CurRegion->rg_Type != RGT_MX))
  803.         CurRegion->rg_Box = TBox;
  804.  
  805.       ReMakeEverything();
  806.     }
  807.   default:
  808.     break;
  809.   }
  810. }
  811.  
  812. /***********************  HandleMenu(im)  ****************************/
  813. void
  814. HandleMenu(im)
  815.   IMsg  *im;
  816. {
  817.   MenuItem *mi;
  818.  
  819.   if (mi = ItemAddress(GMenu, im->Code))
  820.   {
  821.     switch (GTMENUITEM_USERDATA(mi))
  822.     {
  823.     case MENU_PROJ_SAVEAS:
  824.       strcpy(ProjSrcName, ProjName);
  825.       if (GetSaveFile(ProjSrcName) >= 0)
  826.       {
  827.         SaveProject(ProjSrcName);
  828.         issaved = TRUE;
  829.       }
  830.       break;
  831.  
  832.     case MENU_PROJ_SAVE:
  833.       SaveProject(ProjName);
  834.       issaved = TRUE;
  835.       break;
  836.  
  837.     case MENU_PROJ_SAVEMAINNO:
  838.     case MENU_PROJ_SAVEMAINYES:
  839.       sprintf(ProjSrcName, "%s.c", ProjName);
  840.       savemain = (short) GTMENUITEM_USERDATA(mi) - MENU_PROJ_SAVEMAINNO;
  841.       SaveProjectAsSrc(ProjSrcName);
  842.       break;
  843.  
  844.     case MENU_PROJ_SAVEASMAINNO:
  845.     case MENU_PROJ_SAVEASMAINYES:
  846.       sprintf(ProjSrcName, "%s.c", ProjName);
  847.       savemain = (short) GTMENUITEM_USERDATA(mi) - MENU_PROJ_SAVEASMAINNO;
  848.       if (GetSaveFile(ProjSrcName))
  849.         SaveProjectAsSrc(ProjSrcName);
  850.       break;
  851.  
  852.     case MENU_EDIT_SORT:
  853.       SortRegions();
  854.       GadDisabled = 0;
  855.       ReMakeEverything();
  856.       break;
  857.  
  858.     case MENU_EDIT_LOCK:
  859.       if (CurRegion)
  860.       {
  861.         Title("Choose Link Destination String");
  862.         CurState = STATE_LINKREGION;
  863.         DisableGadgets();
  864.       }
  865.       break;
  866.  
  867.     case MENU_EDIT_UNLOCK:
  868.       if (CurRegion)
  869.       {
  870.         Title("Choose ListView to Unlink");
  871.         CurState = STATE_UNLINKREGION;
  872.         DisableGadgets();
  873.       }
  874.       break;
  875.  
  876.     case MENU_PROJ_LOAD:
  877.       if (!issaved)
  878.         if (!(do_request( "Load new without saving old ???", "Yes|Cancel", 0)))
  879.           break;
  880.  
  881.       if (GetSaveFile(ProjName) >= 0)
  882.       {
  883.         TplRegion *rg;
  884.  
  885.         while (rg = GetHead(&RegList))
  886.           DeleteTplRegion(rg);
  887.         LoadProject(ProjName);
  888.         ReMakeEverything();
  889.         init_test();
  890.       }
  891.       break;
  892.  
  893.     case MENU_PROJ_MERGE:
  894.       if (GetSaveFile(ProjSrcName) >= 0)
  895.       {
  896.         LoadProject(ProjSrcName);
  897.         ReMakeEverything();
  898.         init_test();
  899.       }
  900.       break;
  901.  
  902.     case MENU_PROJ_QUIT:
  903.       NotDone = QuitCheck();
  904.       break;
  905.  
  906.     case MENU_SNAP +  1:
  907.     case MENU_SNAP +  2:
  908.     case MENU_SNAP +  4:
  909.     case MENU_SNAP +  6:
  910.     case MENU_SNAP +  8:
  911.     case MENU_SNAP + 10:
  912.     case MENU_SNAP + 12:
  913.     case MENU_SNAP + 14:
  914.     case MENU_SNAP + 16:
  915.     case MENU_SNAP + 18:
  916.     case MENU_SNAP + 20:
  917.       CoorSnap = (short) GTMENUITEM_USERDATA(mi) - MENU_SNAP;
  918.       break;
  919.  
  920.     case MENU_GADGET +  0:
  921.     case MENU_GADGET +  1:
  922.     case MENU_GADGET +  2:
  923.     case MENU_GADGET +  3:
  924.     case MENU_GADGET +  4:
  925.     case MENU_GADGET +  5:
  926.     case MENU_GADGET +  6:
  927.     case MENU_GADGET +  7:
  928.     case MENU_GADGET +  8:
  929.     case MENU_GADGET +  9:
  930.     case MENU_GADGET + 10:
  931.     case MENU_GADGET + 11:
  932.     case MENU_GADGET + 12:
  933.     case MENU_GADGET + 13:
  934.       NewType = (short) GTMENUITEM_USERDATA(mi) - MENU_GADGET;
  935.       GT_SetGadgetAttrs(Gad_gadgets_lv, EWin, NULL,
  936.                         GTLV_Selected,  NewType,
  937.                         TAG_END);
  938.     if (CurRegion)
  939.       DisableEGads(CurRegion);
  940.     else
  941.       DisableEGads((void *)0L);
  942.  
  943.     default:
  944.       break;
  945.     }
  946.   }
  947. }
  948.  
  949. /***********************  Title(tit)  ********************************/
  950. void
  951. Title(tit)
  952.   char  *tit;
  953. {
  954.   if (Win)
  955.   {
  956.     SetWindowTitles(Win, NULL, NULL);
  957.     sprintf(TitleBuf, "%s  %s  %s",
  958.             ProjName,
  959.             (CurRegion) ? CurRegion->rg_Node.ln_Name : "<none>",
  960.             tit);
  961.     SetWindowTitles(Win, TitleBuf, NULL);
  962.   }
  963. }
  964.  
  965. /***********************  TitleState(void)  **************************/
  966. void
  967. TitleState(void)
  968. {
  969.   switch (CurState)
  970.   {
  971.   case STATE_NEWREGION:
  972.   case STATE_SIZEREGION:
  973.     TitleXY(TBox.bo_Xe - TBox.bo_Xs, TBox.bo_Ye - TBox.bo_Ys);
  974.     break;
  975.  
  976.   case STATE_MOVEREGION:
  977.     TitleXY(TBox.bo_Xs, TBox.bo_Ys);
  978.  
  979.     default:
  980.     break;
  981.   }
  982. }
  983.  
  984. /***********************  TitleXY(x, y)  ********************************/
  985. void
  986. TitleXY(x, y)
  987.   short  x, y;
  988. {
  989.   if (x < 0)
  990.     x = -x;
  991.   if (y < 0)
  992.     y = -y;
  993.   sprintf(TmpBuf, "X:%d Y:%d", x, y);
  994.   Title(TmpBuf);
  995. }
  996.  
  997. /***********************  SetCurRegion(rg)  **************************/
  998. TplRegion *
  999. SetCurRegion(rg)
  1000.   TplRegion *rg;
  1001. {
  1002.   CurRegion = rg;
  1003.   Title("selected");
  1004.   return (rg);
  1005. }
  1006.  
  1007. /***********************  do_request() ************************/
  1008.  
  1009. struct EasyStruct textreq =
  1010. {
  1011.   sizeof(struct EasyStruct),            /* ULONG es_StructSize      */
  1012.   0L,                                   /* ULONG es_Flags           */
  1013.   " TplEdit ",                          /* UBYTE *es_Title          */
  1014.   NULL,                                 /* UBYTE *es_TextFormat     */
  1015.   NULL                                  /* UBYTE *es_GadgetFormat   */
  1016. };
  1017.  
  1018. short
  1019. do_request(char *text, char *gads, UWORD *args)
  1020. {
  1021.   textreq.es_TextFormat   = text;
  1022.   textreq.es_GadgetFormat = gads;
  1023.  
  1024.   return (EasyRequestArgs(Win, &textreq, NULL, &args));
  1025. }
  1026.  
  1027. /***********************  init_test() ********************************/
  1028. void
  1029. init_test()
  1030. {
  1031.   CurState = STATE_TEST;
  1032.   GT_SetGadgetAttrs(Gad_actions_mx, EWin, NULL,
  1033.                     GTMX_Active, ACT_TEST,
  1034.                     TAG_END);
  1035.   EnableGadgets();
  1036. }
  1037.  
  1038. /***********************  QuitCheck();  ******************************/
  1039. short
  1040. QuitCheck()
  1041. {
  1042.   if (!issaved)
  1043.     return (!(do_request( "Quit without saving ???", "Yes|Cancel", 0)));
  1044.  
  1045.   return (!(do_request( "Really quit now ???", "Yes|Cancel", 0)));
  1046. }
  1047.