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

  1. /*
  2.  * imagewindow.c  V2.0
  3.  *
  4.  * image edit window handling
  5.  *
  6.  * (c) 1990-1992 Stefan Becker
  7.  */
  8.  
  9. #include "ToolManagerConf.h"
  10.  
  11. /* Image node */
  12. struct ImageNode {
  13.                   struct Node  in_Node;
  14.                   char        *in_File;
  15.                  };
  16.  
  17. /* Window data */
  18. static struct Gadget *gl;             /* Gadget list */
  19. static struct Window *w;              /* Window */
  20. static void *aw;                      /* AppWindow pointer */
  21. static UWORD ww,wh;                   /* Window size */
  22. static struct ImageNode *CurrentNode;
  23. static struct Gadget *CurrentGadget;
  24. static char *DirName=NULL;
  25.  
  26. /* Gadget data */
  27. #define GAD_NAME_STR 0
  28. #define GAD_FILE_BUT 1
  29. #define GAD_FILE_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 filetags[]={GTST_String,   NULL,
  41.                                   GTST_MaxChars, 100,
  42.                                   TAG_DONE};
  43.  
  44. /* Init image edit window */
  45. void InitImageEditWindow(UWORD left, UWORD fheight)
  46. {
  47.  ULONG tmp,tmp2,maxw1,maxw2;
  48.  ULONG strheight=fheight+2;
  49.  struct GadgetData *gd;
  50.  
  51.  /* Init strings */
  52.  gdata[GAD_OK].name    =AppStrings[MSG_WINDOW_OK_GAD];
  53.  gdata[GAD_CANCEL].name=AppStrings[MSG_WINDOW_CANCEL_GAD];
  54.  
  55.  /* Calculate maximum label width for string gadgets */
  56.  maxw1=TextLength(&TmpRastPort,AppStrings[MSG_WINDOW_NAME_GAD],
  57.                   strlen(AppStrings[MSG_WINDOW_NAME_GAD]));
  58.  tmp=TextLength(&TmpRastPort,AppStrings[MSG_IMAGEWIN_FILE_GAD],
  59.                 strlen(AppStrings[MSG_IMAGEWIN_FILE_GAD]))+REQBUTTONWIDTH;
  60.  if (tmp > maxw1) maxw1=tmp;
  61.  maxw1+=INTERWIDTH;
  62.  
  63.  /* Calculate minimal string gadgets width */
  64.  ww=TextLength(&TmpRastPort,
  65.                AppStrings[MSG_IMAGEWIN_NEWNAME],
  66.                strlen(AppStrings[MSG_IMAGEWIN_NEWNAME])
  67.               ) + maxw1 + 3*INTERWIDTH;
  68.  
  69.  /* Calculate button gadgets width */
  70.  gd=&gdata[GAD_OK];
  71.  maxw2=TextLength(&TmpRastPort,gd->name,strlen(gd->name));
  72.  gd++;
  73.  if ((tmp=TextLength(&TmpRastPort,gd->name,strlen(gd->name))) > maxw2)
  74.   maxw2=tmp;
  75.  maxw2+=2*INTERWIDTH;
  76.  if ((tmp=2*(maxw2+INTERWIDTH)) > ww) ww=tmp;
  77.  
  78.  /* window height */
  79.  wh=3*fheight+4*INTERHEIGHT+4;
  80.  
  81.  /* Init gadgets */
  82.  gd=gdata;
  83.  tmp=WindowTop+INTERHEIGHT;
  84.  tmp2=ww-maxw1-INTERWIDTH;
  85.  maxw1+=left;
  86.  
  87.  /* Name string gadget */
  88.  gd->name=AppStrings[MSG_WINDOW_NAME_GAD];
  89.  gd->type=STRING_KIND;
  90.  gd->flags=PLACETEXT_LEFT;
  91.  gd->tags=nametags;
  92.  gd->left=maxw1;
  93.  gd->top=tmp;
  94.  gd->width=tmp2;
  95.  gd->height=strheight;
  96.  tmp+=strheight+INTERHEIGHT;
  97.  
  98.  /* File name button gadget */
  99.  gd++;
  100.  gd->name=AppStrings[MSG_IMAGEWIN_FILE_GAD];
  101.  gd->type=GENERIC_KIND;
  102.  gd->flags=0;
  103.  gd->left=maxw1-REQBUTTONWIDTH;
  104.  gd->top=tmp;
  105.  gd->width=REQBUTTONWIDTH;
  106.  gd->height=strheight;
  107.  
  108.  /* File name string gadget */
  109.  gd++;
  110.  gd->type=STRING_KIND;
  111.  gd->tags=filetags;
  112.  gd->left=maxw1;
  113.  gd->top=tmp;
  114.  gd->width=tmp2;
  115.  gd->height=strheight;
  116.  tmp+=strheight+INTERHEIGHT;
  117.  
  118.  /* OK button gadget */
  119.  gd++;
  120.  gd->type=BUTTON_KIND;
  121.  gd->flags=PLACETEXT_IN;
  122.  gd->left=left;
  123.  gd->top=tmp;
  124.  gd->width=maxw2;
  125.  gd->height=fheight;
  126.  
  127.  /* Cancel button gadget */
  128.  gd++;
  129.  gd->type=BUTTON_KIND;
  130.  gd->flags=PLACETEXT_IN;
  131.  gd->left=ww-maxw2-INTERWIDTH+left;
  132.  gd->top=tmp;
  133.  gd->width=maxw2;
  134.  gd->height=fheight;
  135. }
  136.  
  137. /* Free image node */
  138. void FreeImageNode(struct Node *node)
  139. {
  140.  struct ImageNode *in=node;
  141.  char *s;
  142.  
  143.  if (s=in->in_Node.ln_Name) free(s);
  144.  if (s=in->in_File) free(s);
  145.  
  146.  /* Free node */
  147.  FreeMem(in,sizeof(struct ImageNode));
  148. }
  149.  
  150. /* Copy image node */
  151. struct Node *CopyImageNode(struct Node *node)
  152. {
  153.  struct ImageNode *in,*orignode=node;
  154.  
  155.  /* Alloc memory for exec node */
  156.  if (in=AllocMem(sizeof(struct ImageNode),MEMF_PUBLIC|MEMF_CLEAR)) {
  157.  
  158.   /* Got an old node? */
  159.   if (orignode) {
  160.    /* Yes, copy it */
  161.    if ((!orignode->in_Node.ln_Name || (in->in_Node.ln_Name=
  162.                                   strdup(orignode->in_Node.ln_Name))) &&
  163.        (!orignode->in_File || (in->in_File=strdup(orignode->in_File))))
  164.     return(in);
  165.   } else
  166.    /* No, set defaults */
  167.    if ((in->in_Node.ln_Name=strdup(AppStrings[MSG_IMAGEWIN_NEWNAME])) &&
  168.        (!DirName || (in->in_File=strdup(DirName))))
  169.     /* Return pointer to new node */
  170.     return(in);
  171.  
  172.   FreeImageNode((struct Node *) in);
  173.  }
  174.  /* Call failed */
  175.  return(NULL);
  176. }
  177.  
  178. /* Activate gadget and save pointer to it */
  179. static ActivateAndSetGadget(ULONG num)
  180. {
  181.  CurrentGadget=gdata[num].gadget;
  182.  ActivateGadget(CurrentGadget,w,NULL);
  183. }
  184.  
  185. /* Open image edit window */
  186. BOOL OpenImageEditWindow(struct Node *node, struct Window *parent)
  187. {
  188.  /* Copy node */
  189.  if (CurrentNode=CopyImageNode(node)) {
  190.   /* Set tags */
  191.   nametags[0].ti_Data=CurrentNode->in_Node.ln_Name;
  192.   filetags[0].ti_Data=CurrentNode->in_File;
  193.  
  194.   /* Create gadgets */
  195.   if (gl=CreateGadgetList(gdata,GADGETS)) {
  196.    /* Open window */
  197.    if (w=OpenWindowTags(NULL,WA_Left,parent->LeftEdge,
  198.                              WA_Top,parent->TopEdge+WindowTop,
  199.                              WA_InnerWidth,ww,
  200.                              WA_InnerHeight,wh,
  201.                              WA_AutoAdjust,TRUE,
  202.                              WA_Title,AppStrings[MSG_IMAGEWIN_TITLE],
  203.                              WA_PubScreen,PublicScreen,
  204.                              WA_Flags,WFLG_CLOSEGADGET|WFLG_DRAGBAR|
  205.                                       WFLG_DEPTHGADGET|WFLG_RMBTRAP|
  206.                                       WFLG_ACTIVATE,
  207.                              TAG_DONE)) {
  208.     /* Add as AppWindow */
  209.     aw=NULL;
  210.     if ((!WorkbenchBase) || (!WBScreen) ||
  211.         (aw=AddAppWindowA(0,0,w,AppMsgPort,NULL))) {
  212.      /* Init requester button gadgets */
  213.      InitReqButtonGadget(gdata[GAD_FILE_BUT].gadget);
  214.  
  215.      /* Add gadgets to window */
  216.      AddGList(w,gl,(UWORD) -1,(UWORD) -1,NULL);
  217.      RefreshGList(gl,w,NULL,(UWORD) -1);
  218.      GT_RefreshWindow(w,NULL);
  219.  
  220.      /* Activate first gadget */
  221.      ActivateAndSetGadget(GAD_NAME_STR);
  222.  
  223.      /* Set local variables */
  224.      w->UserPort=IDCMPPort;
  225.      w->UserData=HandleImageEditWindowIDCMP;
  226.      ModifyIDCMP(w,IDCMP_CLOSEWINDOW|IDCMP_REFRESHWINDOW|BUTTONIDCMP|
  227.                    STRINGIDCMP);
  228.      CurrentWindow=w;
  229.      HandleAppMsg=HandleImageEditWindowAppMsg;
  230.  
  231.      /* Set up file requester parameters */
  232.      FileReqParms.frp_Window=w;
  233.      FileReqParms.frp_Title=AppStrings[MSG_FILEREQ_TITLE_FILE];
  234.      FileReqParms.frp_OKText=AppStrings[MSG_WINDOW_OK_GAD];
  235.      FileReqParms.frp_Flags1=FRF_DOPATTERNS;
  236.      FileReqParms.frp_Flags2=0;
  237.  
  238.      /* All OK. */
  239.      return(TRUE);
  240.     }
  241.     CloseWindow(w);
  242.    }
  243.    FreeGadgets(gl);
  244.   }
  245.   FreeImageNode((struct Node *) CurrentNode);
  246.  }
  247.  /* Call failed */
  248.  return(FALSE);
  249. }
  250.  
  251. /* Close image edit window */
  252. static void CloseImageEditWindow(void)
  253. {
  254.  /* Free resources */
  255.  RemoveGList(w,gl,(UWORD) -1);
  256.  HandleAppMsg=NULL;
  257.  if (aw) RemoveAppWindow(aw);
  258.  CloseWindowSafely(w);
  259.  FreeGadgets(gl);
  260. }
  261.  
  262. /* Handle application messages */
  263. void HandleImageEditWindowAppMsg(struct AppMessage *msg)
  264. {
  265.  struct WBArg *wa;
  266.  
  267.  /* Get first argument */
  268.  if (wa=msg->am_ArgList) {
  269.   char *filebuf;
  270.  
  271.   /* Allocate memory for name buffer */
  272.   if (filebuf=malloc(4096)) {
  273.    /* Build full file name */
  274.    if (NameFromLock(wa->wa_Lock,filebuf,4096) &&
  275.        AddPart(filebuf,wa->wa_Name,4096)) {
  276.     /* Set new gadget values */
  277.     GT_SetGadgetAttrs(gdata[GAD_NAME_STR].gadget,w,NULL,
  278.                       GTST_String,wa->wa_Name,TAG_DONE);
  279.     GT_SetGadgetAttrs(gdata[GAD_FILE_STR].gadget,w,NULL,
  280.                       GTST_String,filebuf,TAG_DONE);
  281.    }
  282.    free(filebuf);
  283.   }
  284.  }
  285. }
  286.  
  287. /* Handle image edit window IDCMP events */
  288. void *HandleImageEditWindowIDCMP(struct IntuiMessage *msg)
  289. {
  290.  struct Node *NewNode=NULL;
  291.  
  292.  /* Which IDCMP class? */
  293.  switch (msg->Class) {
  294.   case IDCMP_CLOSEWINDOW:   NewNode=(struct Node *) -1;
  295.                             FreeImageNode((struct Node *) CurrentNode);
  296.                             break;
  297.   case IDCMP_REFRESHWINDOW: GT_BeginRefresh(w);
  298.                             GT_EndRefresh(w,TRUE);
  299.                             break;
  300.   case IDCMP_GADGETUP:
  301.    switch (((struct Gadget *) msg->IAddress)->GadgetID) {
  302.     case GAD_NAME_STR: ActivateAndSetGadget(GAD_FILE_STR);
  303.                        break;
  304.     case GAD_FILE_BUT: {
  305.                         char *file;
  306.                         struct Gadget *g=gdata[GAD_FILE_STR].gadget;
  307.  
  308.                         /* Set file requester parameters */
  309.                         FileReqParms.frp_OldFile=
  310.                          ((struct StringInfo *) g->SpecialInfo)->Buffer;
  311.  
  312.                         /* Open file requester */
  313.                         if (file=OpenFileRequester()) {
  314.                          char *path;
  315.  
  316.                          /* Set new file string */
  317.                          GT_SetGadgetAttrs(g,w,NULL,GTST_String,file,TAG_DONE);
  318.  
  319.                          /* Get new path */
  320.                          path=FilePart(file);
  321.                          if (path!=file) {
  322.                           /* Free old path */
  323.                           if (DirName) free(DirName);
  324.  
  325.                           /* Set new path */
  326.                           DirName=file;
  327.                           *path='\0';
  328.                          }
  329.  
  330.                          /* Activate string gadget */
  331.                          ActivateAndSetGadget(GAD_FILE_STR);
  332.                         } else
  333.                          /* Activate old string gadget */
  334.                          ActivateGadget(CurrentGadget,w,NULL);
  335.                        }
  336.                        break;
  337.     case GAD_FILE_STR: ActivateAndSetGadget(GAD_NAME_STR);
  338.                        break;
  339.     case GAD_OK: {
  340.      char *s;
  341.  
  342.      /* Free old strings */
  343.      if (s=CurrentNode->in_Node.ln_Name) free(s);
  344.      if (s=CurrentNode->in_File) free(s);
  345.  
  346.      /* Duplicate new strings */
  347.      if (((CurrentNode->in_Node.ln_Name=
  348.             DuplicateBuffer(gdata[GAD_NAME_STR].gadget)) != (char *) -1) &&
  349.          ((CurrentNode->in_File=
  350.             DuplicateBuffer(gdata[GAD_FILE_STR].gadget)) != (char *) -1)) {
  351.       char *s=CurrentNode->in_File;
  352.       ULONG len=strlen(s);
  353.  
  354.       /* Strip trailing ".info" */
  355.       if ((len>=5) && !stricmp(s+len-5,".info")) s[len-5]='\0';
  356.       NewNode=CurrentNode;
  357.      } else {
  358.       /* Couldn't copy strings */
  359.       NewNode=(struct Node *) -1;
  360.       CurrentNode->in_Node.ln_Name=NULL;
  361.       CurrentNode->in_File=NULL;
  362.       FreeImageNode((struct Node *) CurrentNode);
  363.      }
  364.     }
  365.     break;
  366.     case GAD_CANCEL:   NewNode=(struct Node *) -1;
  367.                        FreeImageNode((struct Node *) CurrentNode);
  368.                        break;
  369.    }
  370.    break;
  371.  }
  372.  
  373.  /* Close window? */
  374.  if (NewNode) {
  375.   /* Yes. But first reply message!!! */
  376.   GT_ReplyIMsg(msg);
  377.   CloseImageEditWindow();
  378.  }
  379.  
  380.  return(NewNode);
  381. }
  382.  
  383. /* Read TMIM IFF chunk into Image node */
  384. struct Node *ReadImageNode(UBYTE *buf)
  385. {
  386.  struct ImageNode *in;
  387.  
  388.  /* Allocate memory for node */
  389.  if (in=AllocMem(sizeof(struct ImageNode),MEMF_PUBLIC|MEMF_CLEAR)) {
  390.   struct ImagePrefsObject *ipo=buf;
  391.   ULONG sbits=ipo->ipo_StringBits;
  392.   UBYTE *ptr=ipo+1;
  393.  
  394.   if ((!(sbits & IMPO_NAME) || (in->in_Node.ln_Name=GetConfigStr(&ptr))) &&
  395.       (!(sbits & IMPO_FILE) || (in->in_File=GetConfigStr(&ptr))))
  396.    /* All OK. */
  397.    return(in);
  398.  
  399.   /* Call failed */
  400.   FreeImageNode((struct Node *) in);
  401.  }
  402.  return(NULL);
  403. }
  404.  
  405. /* Write Image node to TMIM IFF chunk */
  406. BOOL WriteImageNode(struct IFFHandle *iff, UBYTE *buf, struct Node *node)
  407. {
  408.  struct ImageNode *in=node;
  409.  struct ImagePrefsObject *ipo=buf;
  410.  ULONG sbits=0;
  411.  UBYTE *ptr=ipo+1;
  412.  
  413.  /* Copy strings */
  414.  if (PutConfigStr(in->in_Node.ln_Name,&ptr)) sbits|=IMPO_NAME;
  415.  if (PutConfigStr(in->in_File,&ptr)) sbits|=IMPO_FILE;
  416.  
  417.  /* set string bits */
  418.  ipo->ipo_StringBits=sbits;
  419.  
  420.  /* calculate length */
  421.  sbits=ptr-buf;
  422.  
  423.  DEBUG_PRINTF("chunk size %ld\n",sbits);
  424.  
  425.  /* Open chunk */
  426.  if (PushChunk(iff,0,ID_TMIM,sbits)) return(FALSE);
  427.  
  428.  /* Write chunk */
  429.  if (WriteChunkBytes(iff,buf,sbits)!=sbits) return(FALSE);
  430.  
  431.  /* Close chunk */
  432.  if (PopChunk(iff)) return(FALSE);
  433.  
  434.  /* All OK. */
  435.  return(TRUE);
  436. }
  437.