home *** CD-ROM | disk | FTP | other *** search
/ Otherware / Otherware_1_SB_Development.iso / amiga / utility / misc / toolmana.lha / ToolManager / Source / prefs / soundwindow.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-09-26  |  10.1 KB  |  379 lines

  1. /*
  2.  * soundwindow.c  V2.0
  3.  *
  4.  * sound edit window handling
  5.  *
  6.  * (c) 1990-1992 Stefan Becker
  7.  */
  8.  
  9. #include "ToolManagerConf.h"
  10.  
  11. /* Sound node */
  12. struct SoundNode {
  13.                   struct Node  sn_Node;
  14.                   char        *sn_Command;
  15.                   char        *sn_Port;
  16.                  };
  17.  
  18. /* Window data */
  19. static struct Gadget *gl;             /* Gadget list */
  20. static struct Window *w;              /* Window */
  21. static struct MsgPort *wp;            /* Window user port */
  22. static UWORD ww,wh;                   /* Window size */
  23. static struct SoundNode *CurrentNode;
  24. static struct Gadget *CurrentGadget;
  25.  
  26. /* Gadget data */
  27. #define GAD_NAME_STR  0
  28. #define GAD_COMM_STR  1
  29. #define GAD_AREXX_STR 2
  30. #define GAD_OK        3
  31. #define GAD_CANCEL    4
  32. #define GADGETS       5
  33. static struct GadgetData gdata[GADGETS];
  34.  
  35. /* Gadget tags */
  36. static struct TagItem nametags[]={GTST_String,   NULL,
  37.                                   GTST_MaxChars, 100,
  38.                                   TAG_DONE};
  39.  
  40. static struct TagItem commtags[]={GTST_String,   NULL,
  41.                                   GTST_MaxChars, 100,
  42.                                   TAG_DONE};
  43.  
  44. static struct TagItem arexxtags[]={GTST_String,   NULL,
  45.                                    GTST_MaxChars, 100,
  46.                                    TAG_DONE};
  47.  
  48. /* Init sound edit window */
  49. void InitSoundEditWindow(UWORD left, UWORD fheight)
  50. {
  51.  ULONG tmp,tmp2,maxw1,maxw2;
  52.  ULONG strheight=fheight+2;
  53.  struct GadgetData *gd;
  54.  
  55.  /* Init strings */
  56.  gdata[GAD_NAME_STR].name =AppStrings[MSG_WINDOW_NAME_GAD];
  57.  gdata[GAD_COMM_STR].name =AppStrings[MSG_WINDOW_COMMAND_GAD];
  58.  gdata[GAD_AREXX_STR].name=AppStrings[MSG_SOUNDWIN_AREXX_GAD];
  59.  gdata[GAD_OK].name       =AppStrings[MSG_WINDOW_OK_GAD];
  60.  gdata[GAD_CANCEL].name   =AppStrings[MSG_WINDOW_CANCEL_GAD];
  61.  
  62.  /* Calculate maximum label width for string gadgets */
  63.  gd=gdata;
  64.  maxw1=0;
  65.  for (tmp=GAD_NAME_STR; tmp<=GAD_AREXX_STR; tmp++, gd++)
  66.   if ((tmp2=TextLength(&TmpRastPort,gd->name,strlen(gd->name))) > maxw1)
  67.    maxw1=tmp2;
  68.  maxw1+=INTERWIDTH;
  69.  
  70.  /* Calculate minimal string gadgets width */
  71.  ww=TextLength(&TmpRastPort,AppStrings[MSG_SOUNDWIN_NEWNAME],
  72.                strlen(AppStrings[MSG_SOUNDWIN_NEWNAME]))+
  73.     maxw1+3*INTERWIDTH;
  74.  
  75.  /* Calculate button gadgets width */
  76.  maxw2=TextLength(&TmpRastPort,gd->name,strlen(gd->name));
  77.  gd++;
  78.  if ((tmp=TextLength(&TmpRastPort,gd->name,strlen(gd->name))) > maxw2)
  79.   maxw2=tmp;
  80.  maxw2+=2*INTERWIDTH;
  81.  if ((tmp=2*(maxw2+INTERWIDTH)) > ww) ww=tmp;
  82.  
  83.  /* window height */
  84.  wh=4*fheight+5*INTERHEIGHT+6;
  85.  
  86.  /* Init gadgets */
  87.  gd=gdata;
  88.  tmp=WindowTop+INTERHEIGHT;
  89.  tmp2=ww-maxw1-INTERWIDTH;
  90.  maxw1+=left;
  91.  
  92.  /* Name string gadget */
  93.  gd->type=STRING_KIND;
  94.  gd->flags=PLACETEXT_LEFT;
  95.  gd->tags=nametags;
  96.  gd->left=maxw1;
  97.  gd->top=tmp;
  98.  gd->width=tmp2;
  99.  gd->height=strheight;
  100.  tmp+=strheight+INTERHEIGHT;
  101.  
  102.  /* File name string gadget */
  103.  gd++;
  104.  gd->type=STRING_KIND;
  105.  gd->flags=PLACETEXT_LEFT;
  106.  gd->tags=commtags;
  107.  gd->left=maxw1;
  108.  gd->top=tmp;
  109.  gd->width=tmp2;
  110.  gd->height=strheight;
  111.  tmp+=strheight+INTERHEIGHT;
  112.  
  113.  /* ARexx port gadget */
  114.  gd++;
  115.  gd->type=STRING_KIND;
  116.  gd->flags=PLACETEXT_LEFT;
  117.  gd->tags=arexxtags;
  118.  gd->left=maxw1;
  119.  gd->top=tmp;
  120.  gd->width=tmp2;
  121.  gd->height=strheight;
  122.  tmp+=strheight+INTERHEIGHT;
  123.  
  124.  /* OK button gadget */
  125.  gd++;
  126.  gd->type=BUTTON_KIND;
  127.  gd->flags=PLACETEXT_IN;
  128.  gd->left=left;
  129.  gd->top=tmp;
  130.  gd->width=maxw2;
  131.  gd->height=fheight;
  132.  
  133.  /* Cancel button gadget */
  134.  gd++;
  135.  gd->type=BUTTON_KIND;
  136.  gd->flags=PLACETEXT_IN;
  137.  gd->left=ww-maxw2-INTERWIDTH+left;
  138.  gd->top=tmp;
  139.  gd->width=maxw2;
  140.  gd->height=fheight;
  141. }
  142.  
  143. /* Free sound node */
  144. void FreeSoundNode(struct Node *node)
  145. {
  146.  struct SoundNode *sn=node;
  147.  char *s;
  148.  
  149.  if (s=sn->sn_Node.ln_Name) free(s);
  150.  if (s=sn->sn_Command) free(s);
  151.  if (s=sn->sn_Port) free(s);
  152.  
  153.  /* Free node */
  154.  FreeMem(sn,sizeof(struct SoundNode));
  155. }
  156.  
  157. /* Copy sound node */
  158. struct Node *CopySoundNode(struct Node *node)
  159. {
  160.  struct SoundNode *sn,*orignode=node;
  161.  
  162.  /* Alloc memory for exec node */
  163.  if (sn=AllocMem(sizeof(struct SoundNode),MEMF_CLEAR)) {
  164.  
  165.   /* Got an old node? */
  166.   if (orignode) {
  167.    /* Yes, copy it */
  168.    if ((!orignode->sn_Node.ln_Name || (sn->sn_Node.ln_Name=
  169.                                         strdup(orignode->sn_Node.ln_Name))) &&
  170.        (!orignode->sn_Command || (sn->sn_Command=
  171.                                    strdup(orignode->sn_Command))) &&
  172.        (!orignode->sn_Port || (sn->sn_Port=strdup(orignode->sn_Port))))
  173.     return(sn);
  174.   } else
  175.    /* No, set defaults */
  176.    if (sn->sn_Node.ln_Name=strdup(AppStrings[MSG_SOUNDWIN_NEWNAME]))
  177.     /* Return pointer to new node */
  178.     return(sn);
  179.  
  180.   FreeSoundNode((struct Node *) sn);
  181.  }
  182.  /* Call failed */
  183.  return(NULL);
  184. }
  185.  
  186. /* Activate gadget and save pointer to it */
  187. static ActivateAndSetGadget(ULONG num)
  188. {
  189.  CurrentGadget=gdata[num].gadget;
  190.  ActivateGadget(CurrentGadget,w,NULL);
  191. }
  192.  
  193. /* Open sound edit window */
  194. BOOL OpenSoundEditWindow(struct Node *node, struct Window *parent)
  195. {
  196.  /* Copy node */
  197.  if (CurrentNode=CopySoundNode(node)) {
  198.   /* Set tags */
  199.   nametags[0].ti_Data=CurrentNode->sn_Node.ln_Name;
  200.   commtags[0].ti_Data=CurrentNode->sn_Command;
  201.   arexxtags[0].ti_Data=CurrentNode->sn_Port;
  202.  
  203.   /* Create gadgets */
  204.   if (gl=CreateGadgetList(gdata,GADGETS)) {
  205.    /* Open window */
  206.    if (w=OpenWindowTags(NULL,WA_Left,parent->LeftEdge,
  207.                              WA_Top,parent->TopEdge+WindowTop,
  208.                              WA_InnerWidth,ww,
  209.                              WA_InnerHeight,wh,
  210.                              WA_AutoAdjust,TRUE,
  211.                              WA_Title,AppStrings[MSG_SOUNDWIN_TITLE],
  212.                              WA_PubScreen,PublicScreen,
  213.                              WA_Flags,WFLG_CLOSEGADGET|WFLG_DRAGBAR|
  214.                                       WFLG_DEPTHGADGET|WFLG_RMBTRAP|
  215.                                       WFLG_ACTIVATE,
  216.                              TAG_DONE)) {
  217.     /* Add gadgets to window */
  218.     AddGList(w,gl,(UWORD) -1,(UWORD) -1,NULL);
  219.     RefreshGList(gl,w,NULL,(UWORD) -1);
  220.     GT_RefreshWindow(w,NULL);
  221.  
  222.     /* Activate first gadget */
  223.     ActivateAndSetGadget(GAD_NAME_STR);
  224.  
  225.     /* Set local variables */
  226.     w->UserPort=IDCMPPort;
  227.     w->UserData=HandleSoundEditWindowIDCMP;
  228.     ModifyIDCMP(w,IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW|BUTTONIDCMP|
  229.                   STRINGIDCMP);
  230.     CurrentWindow=w;
  231.  
  232.     /* Set up file requester parameters */
  233.     FileReqParms.frp_Window=w;
  234.     FileReqParms.frp_Title=AppStrings[MSG_FILEREQ_TITLE_FILE];
  235.     FileReqParms.frp_OKText=AppStrings[MSG_WINDOW_OK_GAD];
  236.     FileReqParms.frp_Flags1=FRF_DOPATTERNS;
  237.     FileReqParms.frp_Flags2=0;
  238.  
  239.     /* All OK. */
  240.     return(TRUE);
  241.    }
  242.    FreeGadgets(gl);
  243.   }
  244.   FreeSoundNode((struct Node *) CurrentNode);
  245.  }
  246.  /* Call failed */
  247.  return(FALSE);
  248. }
  249.  
  250. /* Close sound edit window */
  251. static void CloseSoundEditWindow(void)
  252. {
  253.  /* Free resources */
  254.  RemoveGList(w,gl,(UWORD) -1);
  255.  CloseWindowSafely(w);
  256.  FreeGadgets(gl);
  257. }
  258.  
  259. /* Handle sound edit window IDCMP events */
  260. void *HandleSoundEditWindowIDCMP(struct IntuiMessage *msg)
  261. {
  262.  struct Node *NewNode=NULL;
  263.  
  264.  /* Which IDCMP class? */
  265.  switch (msg->Class) {
  266.   case IDCMP_CLOSEWINDOW:   NewNode=(struct Node *) -1;
  267.                             FreeSoundNode((struct Node *) CurrentNode);
  268.                             break;
  269.   case IDCMP_REFRESHWINDOW: GT_BeginRefresh(w);
  270.                             GT_EndRefresh(w,TRUE);
  271.                             break;
  272.   case IDCMP_GADGETUP:
  273.    switch (((struct Gadget *) msg->IAddress)->GadgetID) {
  274.     case GAD_NAME_STR:  ActivateAndSetGadget(GAD_COMM_STR);
  275.                         break;
  276.     case GAD_COMM_STR:  ActivateAndSetGadget(GAD_AREXX_STR);
  277.                         break;
  278.     case GAD_AREXX_STR: ActivateAndSetGadget(GAD_NAME_STR);
  279.                         break;
  280.     case GAD_OK: {
  281.      char *s;
  282.  
  283.      /* Free old strings */
  284.      if (s=CurrentNode->sn_Node.ln_Name) free(s);
  285.      if (s=CurrentNode->sn_Command) free(s);
  286.      if (s=CurrentNode->sn_Port) free(s);
  287.  
  288.      /* Duplicate new strings */
  289.      if (((CurrentNode->sn_Node.ln_Name=
  290.             DuplicateBuffer(gdata[GAD_NAME_STR].gadget)) != (char *) -1) &&
  291.          ((CurrentNode->sn_Command=
  292.             DuplicateBuffer(gdata[GAD_COMM_STR].gadget)) != (char *) -1) &&
  293.          ((CurrentNode->sn_Port=
  294.             DuplicateBuffer(gdata[GAD_AREXX_STR].gadget)) != (char *) -1))
  295.       NewNode=CurrentNode;
  296.      else {
  297.       /* Couldn't copy strings */
  298.       NewNode=(struct Node *) -1;
  299.       CurrentNode->sn_Node.ln_Name=NULL;
  300.       CurrentNode->sn_Command=NULL;
  301.       CurrentNode->sn_Port=NULL;
  302.       FreeSoundNode((struct Node *) CurrentNode);
  303.      }
  304.     }
  305.     break;
  306.     case GAD_CANCEL:    NewNode=(struct Node *) -1;
  307.                         FreeSoundNode((struct Node *) CurrentNode);
  308.                         break;
  309.    }
  310.    break;
  311.  }
  312.  
  313.  /* Close window? */
  314.  if (NewNode) {
  315.   /* Yes. But first reply message!!! */
  316.   GT_ReplyIMsg(msg);
  317.   CloseSoundEditWindow();
  318.  }
  319.  
  320.  return(NewNode);
  321. }
  322.  
  323. /* Read TMSO IFF chunk into Sound node */
  324. struct Node *ReadSoundNode(UBYTE *buf)
  325. {
  326.  struct SoundNode *sn;
  327.  
  328.  /* Allocate memory for node */
  329.  if (sn=AllocMem(sizeof(struct SoundNode),MEMF_PUBLIC|MEMF_CLEAR)) {
  330.   struct SoundPrefsObject *spo=buf;
  331.   ULONG sbits=spo->spo_StringBits;
  332.   UBYTE *ptr=spo+1;
  333.  
  334.   if ((!(sbits & SOPO_NAME) || (sn->sn_Node.ln_Name=GetConfigStr(&ptr))) &&
  335.       (!(sbits & SOPO_COMMAND) || (sn->sn_Command=GetConfigStr(&ptr))) &&
  336.       (!(sbits & SOPO_PORT) || (sn->sn_Port=GetConfigStr(&ptr))))
  337.    /* All OK. */
  338.    return(sn);
  339.  
  340.   /* Call failed */
  341.   FreeSoundNode((struct Node *) sn);
  342.  }
  343.  return(NULL);
  344. }
  345.  
  346. /* Write Sound node to TMSO IFF chunk */
  347. BOOL WriteSoundNode(struct IFFHandle *iff, UBYTE *buf, struct Node *node)
  348. {
  349.  struct SoundNode *sn=node;
  350.  struct SoundPrefsObject *spo=buf;
  351.  ULONG sbits=0;
  352.  UBYTE *ptr=spo+1;
  353.  
  354.  /* Copy strings */
  355.  if (PutConfigStr(sn->sn_Node.ln_Name,&ptr)) sbits|=SOPO_NAME;
  356.  if (PutConfigStr(sn->sn_Command,&ptr)) sbits|=SOPO_COMMAND;
  357.  if (PutConfigStr(sn->sn_Port,&ptr)) sbits|=SOPO_PORT;
  358.  
  359.  /* set string bits */
  360.  spo->spo_StringBits=sbits;
  361.  
  362.  /* calculate length */
  363.  sbits=ptr-buf;
  364.  
  365.  DEBUG_PRINTF("chunk size %ld\n",sbits);
  366.  
  367.  /* Open chunk */
  368.  if (PushChunk(iff,0,ID_TMSO,sbits)) return(FALSE);
  369.  
  370.  /* Write chunk */
  371.  if (WriteChunkBytes(iff,buf,sbits)!=sbits) return(FALSE);
  372.  
  373.  /* Close chunk */
  374.  if (PopChunk(iff)) return(FALSE);
  375.  
  376.  /* All OK. */
  377.  return(TRUE);
  378. }
  379.