home *** CD-ROM | disk | FTP | other *** search
/ Amiga Times / AmigaTimes.iso / sonstiges / tools / amiCheck / Source / scriptPanel.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-10-06  |  12.6 KB  |  523 lines

  1. /* scriptPanel.c 
  2.  *
  3.  *  defines the GUIFront characteristics of the script panel 
  4.  */
  5.   
  6. #include <stdio.h>  
  7. #include <intuition/gadgetclass.h>
  8. #include <exec/memory.h>
  9. #include <clib/exec_protos.h>
  10. #include <clib/asl_protos.h>
  11. #include <libraries/asl.h>
  12.  
  13. #include "amiCheck.h"
  14. #include "regGadget.h"
  15. #include "dataBase.h"
  16. #include "scriptPanel.h"
  17. #include <string.h>
  18.  
  19.  
  20. /* prototypes */
  21. BOOL ScriptHandleGadget(struct IntuiMessage *);
  22. BOOL ScriptInit(void);
  23. void ScriptDisableGads(BOOL);
  24. scriptNode *ScriptAddNode(char *);
  25. BOOL ScriptSave (char *);
  26. BOOL ScriptLoad (char *);
  27.  
  28. WORD scriptEntries;
  29. struct Window *scriptWin;
  30. struct List scriptList;
  31. ExtErrorData ScriptExtData;
  32. GUIFront *scriptGUI;
  33. UWORD    scriptlistActive;
  34. char sctitle[100];
  35. char fname[100];
  36.  
  37. /* quick configure of some gadgets */
  38.  
  39. /* define gadgetspec */
  40. GadgetSpec SCPgadgetspecs[] = 
  41. {
  42.     {LISTVIEW_KIND,20,8, {0,0,0,0,NULL,NULL,GID_SCPTEMPLIST,
  43.         PLACETEXT_ABOVE},ListView,GS_DefaultTags},
  44.  
  45.     {LISTVIEW_KIND,20,8, {0,0,0,0,NULL,NULL,GID_SCPLIST,
  46.         PLACETEXT_ABOVE},ListView,GS_DefaultTags},
  47.  
  48.         {BUTTON_KIND,0,0,{0,0,0,0,"_Open", NULL, GID_SCPOPEN,         
  49.                 PLACETEXT_IN}, NULL, GS_DefaultTags},
  50.  
  51.         {BUTTON_KIND,0,0,{0,0,0,0,"_Save", NULL, GID_SCPSAVE,         
  52.                 PLACETEXT_IN}, NULL, GS_DefaultTags},
  53.  
  54.         {BUTTON_KIND,0,0,{0,0,0,0,"Save _As", NULL, GID_SCPSAVEAS,         
  55.                 PLACETEXT_IN}, NULL, GS_DefaultTags},
  56.  
  57.         {BUTTON_KIND,0,0,{0,0,0,0,"_Up", NULL, GID_SCPUP,         
  58.                 PLACETEXT_IN}, NULL, GS_DefaultTags},
  59.  
  60.         {BUTTON_KIND,0,0,{0,0,0,0,"_Down", NULL, GID_SCPDOWN,         
  61.                 PLACETEXT_IN}, NULL, GS_DefaultTags},
  62.  
  63.         {BUTTON_KIND,0,0,{0,0,0,0,"_Top", NULL, GID_SCPTOP,         
  64.                 PLACETEXT_IN}, NULL, GS_DefaultTags},
  65.  
  66.         {BUTTON_KIND,0,0,{0,0,0,0,"_Bottom", NULL, GID_SCPBOTTOM,         
  67.                 PLACETEXT_IN}, NULL, GS_DefaultTags},
  68.  
  69.         {BUTTON_KIND,0,0,{0,0,0,0,"_Remove", NULL, GID_SCPREMOVE,         
  70.                 PLACETEXT_IN}, NULL, GS_DefaultTags},
  71.  
  72.         {BUTTON_KIND,0,0,{0,0,0,0,"_Cancel", NULL, GID_SCPCANCEL,        
  73.                 PLACETEXT_IN}, NULL, GS_DefaultTags},
  74. };
  75.  
  76. /* set up array of pointers to our specs */
  77. GadgetSpec *SCP_ScriptSpecs[] =
  78. {
  79.         &SCPgadgetspecs[0],
  80.         &SCPgadgetspecs[1],
  81.         &SCPgadgetspecs[2],
  82.         &SCPgadgetspecs[3],
  83.         &SCPgadgetspecs[4],
  84.         &SCPgadgetspecs[5],
  85.         &SCPgadgetspecs[6],
  86.         &SCPgadgetspecs[7],
  87.         &SCPgadgetspecs[8],
  88.         &SCPgadgetspecs[9],
  89.     &SCPgadgetspecs[10],
  90.         NULL,
  91. };
  92.  
  93.  
  94. /* define the layout of this panel */
  95. ULONG SCP_ScriptPanel[] =
  96. {
  97.    GUIL_Flags, GUILF_PropShare | GUILF_EqualWidth,
  98.  
  99.    GUIL_HorizGroup, 1,
  100.         GUIL_Flags, GUILF_PropShare,
  101.     GUIL_FrameType, GUILFT_Recess,
  102.         
  103.     GUIL_VertGroup, 1,
  104.  
  105.         GUIL_HorizGroup,1,
  106.  
  107.             GUIL_HorizGroup,1,
  108.                 GUIL_FrameType, GUILFT_Ridge,
  109.                 GUIL_FrameHeadline, "Templates",
  110.  
  111.                 GUIL_GadgetSpecID, GID_SCPTEMPLIST,
  112.             TAG_DONE,
  113.  
  114.             GUIL_HorizGroup,1,
  115.  
  116.                 GUIL_FrameType, GUILFT_Ridge,
  117.                 GUIL_FrameHeadline, "Script List",
  118.  
  119.                 GUIL_GadgetSpecID, GID_SCPLIST,
  120.  
  121.                         GUIL_VertGroup,1,
  122.                                 GUIL_Flags, GUILF_PropShare | GUILF_EqualWidth | GUILF_EqualHeight,
  123.                                               
  124.                     GUIL_GadgetSpecID, GID_SCPUP,
  125.                     GUIL_GadgetSpecID, GID_SCPDOWN,
  126.                     GUIL_GadgetSpecID, GID_SCPTOP,
  127.                     GUIL_GadgetSpecID, GID_SCPBOTTOM,
  128.                     GUIL_GadgetSpecID, GID_SCPREMOVE,
  129.                 TAG_DONE,
  130.                        TAG_DONE,
  131.  
  132.         TAG_DONE,
  133.  
  134.     TAG_DONE,
  135.         
  136.     TAG_DONE,
  137.     
  138.     GUIL_HorizGroup,1,
  139.         GUIL_Flags, GUILF_EqualSize | GUILF_EqualWidth,
  140.         
  141.        GUIL_GadgetSpecID, GID_SCPSAVE,
  142.        GUIL_GadgetSpecID, GID_SCPSAVEAS,
  143.            GUIL_GadgetSpecID, GID_SCPOPEN,
  144.            GUIL_GadgetSpecID, GID_SCPCANCEL,
  145.            
  146.     TAG_DONE,   
  147.            
  148. TAG_DONE,
  149. };
  150.  
  151.  
  152. /****************************************************
  153. * ScriptGUI ()
  154. *
  155. *    Creates the GUI for the script panel.
  156. *****************************************************/
  157. void ScriptGUI(void)
  158. {
  159.  BOOL done = FALSE;
  160.  BOOL noreply;
  161.  UWORD ordinal;
  162.  ULONG signal;
  163.      
  164.  AmiLock();
  165.  
  166.      GF_SetGUIAttr(scriptGUI, GUI_OpenGUI, TRUE, TAG_DONE);
  167.      /* grab window */
  168.      GF_GetGUIAttr(scriptGUI,GUI_Window,&scriptWin,TAG_DONE);
  169.     if (!ScriptInit())
  170.         done = TRUE;
  171.  
  172.  
  173.                 /* Process input events */
  174.                 while (!done)
  175.                 {
  176.                     struct IntuiMessage *imsg;
  177.  
  178.                     /* Wait for an event to occur */
  179.  
  180.                     signal = GF_Wait(guiapp,AmigaGuideSignal(agc));
  181.             if (signal & AmigaGuideSignal(agc)) {
  182.             AmiHelpMsg();
  183.             continue;
  184.             }
  185.  
  186.                     /* We only bother to listen for CLOSEWINDOW events.
  187.                      * Of course, in a real application, you would be
  188.                      * examining the Class field for IDCMP_GADGETUP
  189.                      * messages and act accordingly.
  190.                      */
  191.  
  192.                     while (imsg = GF_GetIMsg(guiapp))
  193.                     {
  194.             noreply = TRUE;
  195.                         switch (imsg->Class) {
  196.                 case IDCMP_REFRESHWINDOW:
  197.                     RegRefresh(TRUE);
  198.                     break;
  199.  
  200.                                 case IDCMP_CLOSEWINDOW:
  201.                     done = TRUE;
  202.                                         break;
  203.  
  204.                 case IDCMP_RAWKEY:
  205.                     AmiHelpKey(imsg,SCRIPT_PANEL);
  206.  
  207.                     if (IsListEmpty(&scriptList))
  208.                         break;
  209.                     if (GF_ProcessListView(scriptGUI,SCP_ScriptSpecs[GID_SCPLIST],
  210.                         imsg,&ordinal)) {
  211.                             scriptlistActive = ordinal;
  212.                             ScriptDisableGads(FALSE);
  213.                     }
  214.                     break;
  215.  
  216.                 case IDCMP_GADGETUP:
  217.                     noreply = FALSE;
  218.                     done=ScriptHandleGadget(imsg);
  219.                     break;
  220.                         }
  221.                                      
  222.                               
  223.                         if (noreply) GF_ReplyIMsg(imsg);
  224.                     }
  225.                 }
  226.  
  227.     GF_SetGadgetAttrs(scriptGUI,SCPgadgetspecs[GID_SCPLIST].gs_Gadget,
  228.             GTLV_Labels, ~0,
  229.             TAG_DONE);
  230.  
  231.     GF_SetGadgetAttrs(scriptGUI,SCPgadgetspecs[GID_SCPTEMPLIST].gs_Gadget,
  232.             GTLV_Labels, ~0,
  233.             TAG_DONE);
  234.  
  235.    DataFreeList(&scriptList);
  236.    GF_SetGUIAttr(scriptGUI, GUI_OpenGUI, FALSE, TAG_DONE);
  237.    AmiUnlock();
  238.   return;
  239. }
  240.  
  241. /***************************************************
  242. * ScriptHandleGadget()
  243. *
  244. *    Handles gadget events for this panel
  245. ****************************************************/
  246. BOOL  ScriptHandleGadget(struct IntuiMessage *imsg)
  247. {
  248.  BOOL done = FALSE;
  249.  struct Gadget *gad = (struct Gadget *)(imsg->IAddress);
  250.  UWORD code = imsg->Code;
  251.  templateNode *temp;
  252.  scriptNode *scr;
  253.  
  254.  switch (gad->GadgetID) {
  255.     
  256.     case GID_SCPTEMPLIST:
  257.         if (code == SCRIPTTYPE)
  258.             break;
  259.  
  260.         temp = (templateNode *)DataOrd2Node(&templates,code);
  261.         GF_SetGadgetAttrs(scriptGUI,SCPgadgetspecs[GID_SCPLIST].gs_Gadget,
  262.             GTLV_Labels, ~0,
  263.             TAG_DONE);
  264.  
  265.         scr=ScriptAddNode(temp->tempname);
  266.         scriptlistActive = scriptEntries;
  267.         GF_SetGadgetAttrs(scriptGUI,SCPgadgetspecs[GID_SCPLIST].gs_Gadget,
  268.             GTLV_Labels, &scriptList,
  269.             GTLV_Selected,scriptlistActive,
  270.             TAG_DONE);
  271.         
  272.         scriptEntries++;
  273.         ScriptDisableGads(FALSE);
  274.  
  275.         GF_SetGadgetAttrs(scriptGUI,SCPgadgetspecs[GID_SCPSAVEAS].gs_Gadget,
  276.             GA_Disabled, FALSE,
  277.             TAG_DONE);
  278.         break;
  279.  
  280.     case GID_SCPLIST:
  281.         scriptlistActive = code;
  282.         ScriptDisableGads(FALSE);
  283.         break;
  284.  
  285.     case GID_SCPSAVE:
  286.             if (ScriptSave(fname) != TRUE)
  287.                 AmiAnnounce("Encountered trouble trying to save script.");
  288.         break;
  289.     
  290.     case GID_SCPSAVEAS:
  291.         GF_LockGUI(scriptGUI);
  292.         if (AmiGetFile(scriptGUI,scriptsaveASL,fname,100)) {
  293.             if (ScriptSave(fname) != TRUE)
  294.                 AmiAnnounce("Encountered trouble trying to save script.");
  295.  
  296.             DataAttachIcon(iconPath,"AC_Script",fname);
  297.             GF_SetGadgetAttrs(scriptGUI,SCPgadgetspecs[GID_SCPSAVE].gs_Gadget,
  298.                 GA_Disabled, FALSE,
  299.                 TAG_DONE);
  300.  
  301.             sprintf(sctitle,"Script Editor: %s",scriptsaveASL->fr_File);
  302.             SetWindowTitles(scriptWin,sctitle,(UBYTE *)-1);
  303.         }
  304.         GF_UnlockGUI(scriptGUI);
  305.  
  306.         break;
  307.  
  308.     case GID_SCPOPEN:
  309.         GF_LockGUI(scriptGUI);
  310.         if (AmiGetFile(scriptGUI,scriptASL,fname,100)) {
  311.             GF_SetGadgetAttrs(scriptGUI,SCPgadgetspecs[GID_SCPLIST].gs_Gadget,
  312.                 GTLV_Labels, ~0,
  313.                 TAG_DONE);
  314.  
  315.             DataFreeList(&scriptList);
  316.             sprintf(sctitle,"Script Editor: %s",scriptASL->fr_File);
  317.             SetWindowTitles(scriptWin,sctitle,(UBYTE *)-1);
  318.             
  319.             if (ScriptLoad(fname) != TRUE) 
  320.                 AmiAnnounce("Encountered trouble trying to load script.");
  321.  
  322.             GF_SetGadgetAttrs(scriptGUI,SCPgadgetspecs[GID_SCPSAVE].gs_Gadget,
  323.                 GA_Disabled, FALSE,
  324.                 TAG_DONE);
  325.  
  326.             GF_SetGadgetAttrs(scriptGUI,SCPgadgetspecs[GID_SCPSAVEAS].gs_Gadget,
  327.                 GA_Disabled, FALSE,
  328.                 TAG_DONE);
  329.  
  330.             GF_SetGadgetAttrs(scriptGUI,SCPgadgetspecs[GID_SCPLIST].gs_Gadget,
  331.                 GTLV_Labels, &scriptList,
  332.                 GTLV_Selected, ~0,
  333.                 TAG_DONE);
  334.  
  335.             ScriptDisableGads(TRUE);
  336.         }
  337.         GF_UnlockGUI(scriptGUI);
  338.         break;
  339.  
  340.     case GID_SCPREMOVE:
  341.         DataListRemove(scriptGUI, SCPgadgetspecs[GID_SCPLIST].gs_Gadget, 
  342.             &scriptList, &scriptlistActive);
  343.  
  344.         if (IsListEmpty(&scriptList))
  345.             ScriptDisableGads(TRUE);
  346.  
  347.         scriptEntries--;
  348.         break;
  349.  
  350.     case GID_SCPUP:
  351.         DataListUp(scriptGUI, SCPgadgetspecs[GID_SCPLIST].gs_Gadget, 
  352.             &scriptList, &scriptlistActive);
  353.         break;
  354.  
  355.     case GID_SCPDOWN:
  356.         DataListDown(scriptGUI, SCPgadgetspecs[GID_SCPLIST].gs_Gadget, 
  357.             &scriptList, &scriptlistActive);
  358.         break;
  359.  
  360.     case GID_SCPTOP:
  361.         DataListTop(scriptGUI, SCPgadgetspecs[GID_SCPLIST].gs_Gadget, 
  362.             &scriptList, &scriptlistActive,0);
  363.         break;
  364.  
  365.     case GID_SCPBOTTOM:
  366.         DataListBottom(scriptGUI, SCPgadgetspecs[GID_SCPLIST].gs_Gadget, 
  367.             &scriptList, &scriptlistActive, scriptEntries);
  368.         break;
  369.     
  370.     case GID_SCPCANCEL:
  371.         done = TRUE;
  372.         break;
  373.  
  374.  }
  375.  
  376.  GF_ReplyIMsg(imsg);
  377.  return (done);
  378. }
  379.  
  380. /****************************************************
  381. * ScriptInit()
  382. *
  383. *    Set up some globals
  384. *****************************************************/
  385. BOOL ScriptInit(void)
  386. {
  387.  
  388.  sprintf(sctitle,"Script Editor: untitled.ACscript");
  389.  SetWindowTitles(scriptWin,sctitle,(UBYTE *)-1);
  390.  
  391.  NewList (&scriptList);
  392.  
  393.  scriptlistActive = -1;
  394.  scriptEntries = 0;
  395.  GF_SetGadgetAttrs(scriptGUI,SCPgadgetspecs[GID_SCPTEMPLIST].gs_Gadget,
  396.             GTLV_Labels, &templates,
  397.             GTLV_Selected,~0,
  398.             TAG_DONE);
  399.  
  400.  GF_SetGadgetAttrs(scriptGUI,SCPgadgetspecs[GID_SCPLIST].gs_Gadget,
  401.             GTLV_Labels, ~0,
  402.             GTLV_Selected,~0,
  403.             TAG_DONE);
  404.  
  405.  GF_SetGadgetAttrs(scriptGUI,SCPgadgetspecs[GID_SCPSAVE].gs_Gadget,
  406.     GA_Disabled, TRUE,
  407.     TAG_DONE);
  408.  
  409.  GF_SetGadgetAttrs(scriptGUI,SCPgadgetspecs[GID_SCPSAVEAS].gs_Gadget,
  410.     GA_Disabled, TRUE,
  411.     TAG_DONE);
  412.  
  413.  ScriptDisableGads(TRUE);
  414.  
  415.  return (TRUE);
  416. }
  417.  
  418. /****************************************************
  419. * ScriptDisableGads()
  420. *
  421. *    Disable/Enable extra gadgets
  422. *****************************************************/
  423. void ScriptDisableGads(BOOL dis)
  424. {
  425.  
  426.  GF_SetGadgetAttrs(scriptGUI,SCPgadgetspecs[GID_SCPREMOVE].gs_Gadget,
  427.     GA_Disabled, dis,
  428.     TAG_DONE);
  429.  
  430.  GF_SetGadgetAttrs(scriptGUI,SCPgadgetspecs[GID_SCPUP].gs_Gadget,
  431.     GA_Disabled, dis,
  432.     TAG_DONE);
  433.  
  434.  GF_SetGadgetAttrs(scriptGUI,SCPgadgetspecs[GID_SCPDOWN].gs_Gadget,
  435.     GA_Disabled, dis,
  436.     TAG_DONE);
  437.  
  438.  GF_SetGadgetAttrs(scriptGUI,SCPgadgetspecs[GID_SCPTOP].gs_Gadget,
  439.     GA_Disabled, dis,
  440.     TAG_DONE);
  441.  
  442.  GF_SetGadgetAttrs(scriptGUI,SCPgadgetspecs[GID_SCPBOTTOM].gs_Gadget,
  443.     GA_Disabled, dis,
  444.     TAG_DONE);
  445.  
  446. }
  447.  
  448. /****************************************************
  449. * ScriptAddNode()
  450. *
  451. *    Add a node to the script list
  452. *****************************************************/
  453. scriptNode *ScriptAddNode(char *name)
  454. {
  455.  scriptNode *temp;
  456.  
  457.  temp = (scriptNode *)AllocVec(sizeof(scriptNode),MEMF_CLEAR);
  458.  if (temp == NULL)
  459.     return(NULL);
  460.  
  461.  strcpy(temp->scname, name);
  462.  temp->node.ln_Name = temp->scname;
  463.  AddTail(&scriptList,temp);
  464.  
  465.  return (temp);
  466. }
  467.  
  468. /**************************************************************************
  469. * ScriptSave()
  470. *
  471. *    Saves a script file
  472. ***************************************************************************/
  473. BOOL ScriptSave (char *fname)
  474. {
  475.  scriptNode *temp = (scriptNode *)scriptList.lh_Head, *next;
  476.  FILE *file;
  477.  
  478.  if (IsListEmpty(&scriptList))
  479.     return(TRUE);
  480.  
  481.  if ( (file = fopen(fname,"w")) == NULL)
  482.     return (FALSE);
  483.  
  484.  while ( (next = (scriptNode *)(temp->node.ln_Succ)) ) {
  485.         fprintf(file,"%s",temp->scname);
  486.         if (temp->node.ln_Succ != NULL)
  487.             fprintf(file,"\n");
  488.         temp = next;
  489.  }
  490.  
  491.  fclose(file);
  492.  return (TRUE);
  493. }
  494.  
  495. /**************************************************************************
  496. * ScriptLoad()
  497. *
  498. *    Loads a script file
  499. ***************************************************************************/
  500. BOOL ScriptLoad (char *fname)
  501. {
  502.  char template[100];
  503.  FILE *file;
  504.  
  505.  NewList(&scriptList);
  506.  scriptEntries = 0;
  507.  
  508.  if ( (file = fopen(fname,"r")) == NULL)
  509.     return (FALSE);
  510.  
  511.  /* while ( fscanf(file,"%s",template) != EOF) {*/
  512.    while ( fgets(template,99,file) != NULL) {
  513.         if (strlen(template) > 0)
  514.             template[strlen(template)-1] = 0;
  515.  
  516.         ScriptAddNode(template);
  517.         scriptEntries ++;
  518.  }
  519.  
  520.  fclose(file);
  521.  return (TRUE);
  522. }
  523.