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

  1. /*
  2.  * menuobj.c  V2.0
  3.  *
  4.  * TMObject, Type: Menu
  5.  *
  6.  * (c) 1990-1992 Stefan Becker
  7.  */
  8.  
  9. #include "ToolManagerLib.h"
  10.  
  11. /* extended TMObject structure for TMOBJTYPE_MENU objects */
  12. struct TMObjectMenu {
  13.                      struct TMObject  mo_Object;
  14.                      struct TMLink   *mo_ExecLink;
  15.                      struct TMLink   *mo_SoundLink;
  16.                      struct TMLink    mo_Link;
  17.                      void            *mo_AppMenu;
  18.                     };
  19.  
  20. /* Create a Menu object */
  21. struct TMObject *CreateTMObjectMenu(struct TMHandle *handle, char *name,
  22.                                     struct TagItem *tags)
  23. {
  24.  /* Open Workbench */
  25.  if (GetWorkbench()) {
  26.   struct TMObjectMenu *tmobj;
  27.  
  28.   /* allocate memory for object */
  29.   if (tmobj=AllocateTMObject(sizeof(struct TMObjectMenu))) {
  30.    struct TagItem *ti,*tstate;
  31.  
  32.    /* Scan tag list */
  33.    tstate=tags;
  34.    while (ti=NextTagItem(&tstate)) {
  35.  
  36.     DEBUG_PRINTF("Got Tag (0x%08lx)\n",ti->ti_Tag);
  37.  
  38.     switch (ti->ti_Tag) {
  39.      case TMOP_Exec:  if (ti->ti_Data) {
  40.                        if (tmobj->mo_ExecLink) /* Already got a link? */
  41.                         /* Yep. Remove it! */
  42.                         RemLinkTMObject(tmobj->mo_ExecLink);
  43.  
  44.                        /* Create new link to exec object */
  45.                        tmobj->mo_ExecLink=AddLinkTMObject(handle,
  46.                                                           (char *) ti->ti_Data,
  47.                                                           TMOBJTYPE_EXEC,
  48.                                                           (struct TMObject *)
  49.                                                            tmobj);
  50.                       }
  51.                       break;
  52.      case TMOP_Sound: if (ti->ti_Data) {
  53.                        if (tmobj->mo_SoundLink) /* Already got a link? */
  54.                        RemLinkTMObject(tmobj->mo_SoundLink); /* Remove it! */
  55.  
  56.                       /* Create new link to exec object */
  57.                       tmobj->mo_SoundLink=AddLinkTMObject(handle,
  58.                                                           (char *) ti->ti_Data,
  59.                                                           TMOBJTYPE_SOUND,
  60.                                                           (struct TMObject *)
  61.                                                            tmobj);
  62.                       }
  63.                       break;
  64.     }
  65.    }
  66.  
  67.    /* Add menu entry */
  68.    if (tmobj->mo_AppMenu=AddAppMenuItemA((ULONG) &tmobj->mo_Link,NULL,name,
  69.                                          AppMsgPort,NULL)) {
  70.     /* Initialize rest of structure */
  71.     tmobj->mo_Link.tml_Linked=tmobj;
  72.  
  73.     /* All OK */
  74.     return(tmobj);
  75.    }
  76.    else {
  77.     /* Remove links */
  78.     if (tmobj->mo_ExecLink) RemLinkTMObject(tmobj->mo_ExecLink);
  79.     if (tmobj->mo_SoundLink) RemLinkTMObject(tmobj->mo_SoundLink);
  80.    }
  81.    FreeMem(tmobj,sizeof(struct TMObjectMenu));
  82.   }
  83.   FreeWorkbench();
  84.  }
  85.  /* call failed */
  86.  return(NULL);
  87. }
  88.  
  89. /* Delete a Menu object */
  90. BOOL DeleteTMObjectMenu(struct TMObjectMenu *tmobj)
  91. {
  92.  DEBUG_PRINTF("Delete/Menu (0x%08lx)\n",tmobj);
  93.  
  94.  /* Free resources */
  95.  SafeRemoveAppMenuItem(tmobj->mo_AppMenu,&tmobj->mo_Link);
  96.  FreeWorkbench();
  97.  
  98.  /* Remove links */
  99.  if (tmobj->mo_ExecLink) RemLinkTMObject(tmobj->mo_ExecLink);
  100.  if (tmobj->mo_SoundLink) RemLinkTMObject(tmobj->mo_SoundLink);
  101.  
  102.  /* Remove object from list */
  103.  Remove((struct Node *) tmobj);
  104.  
  105.  /* Free object */
  106.  FreeMem(tmobj,sizeof(struct TMObjectMenu));
  107.  
  108.  /* All OK. */
  109.  return(TRUE);
  110. }
  111.  
  112. /* Change a Menu object */
  113. struct TMObject *ChangeTMObjectMenu(struct TMHandle *handle,
  114.                                     struct TMObjectMenu *tmobj,
  115.                                     struct TagItem *tags)
  116. {
  117.  struct TagItem *ti,*tstate;
  118.  
  119.  /* Scan tag list */
  120.  tstate=tags;
  121.  while (ti=NextTagItem(&tstate)) {
  122.  
  123.   DEBUG_PRINTF("Got Tag (0x%08lx)\n",ti->ti_Tag);
  124.  
  125.   switch (ti->ti_Tag) {
  126.    case TMOP_Exec:  if (tmobj->mo_ExecLink) { /* Already got a link? */
  127.                      /* Yep. Remove it! */
  128.                      RemLinkTMObject(tmobj->mo_ExecLink);
  129.                      tmobj->mo_ExecLink=NULL;
  130.                     }
  131.  
  132.                     if (ti->ti_Data) {
  133.                      /* Create new link to exec object */
  134.                      tmobj->mo_ExecLink=AddLinkTMObject(handle,
  135.                                                         (char *) ti->ti_Data,
  136.                                                         TMOBJTYPE_EXEC,
  137.                                                         (struct TMObject *)
  138.                                                          tmobj);
  139.                     }
  140.                     break;
  141.    case TMOP_Sound: if (tmobj->mo_SoundLink) { /* Already got a link? */
  142.                      /* Yep. Remove it! */
  143.                      RemLinkTMObject(tmobj->mo_SoundLink);
  144.                      tmobj->mo_SoundLink=NULL;
  145.                     }
  146.  
  147.                     if (ti->ti_Data) {
  148.                      /* Create new link to exec object */
  149.                      tmobj->mo_SoundLink=AddLinkTMObject(handle,
  150.                                                          (char *) ti->ti_Data,
  151.                                                          TMOBJTYPE_SOUND,
  152.                                                          (struct TMObject *)
  153.                                                           tmobj);
  154.                     }
  155.                     break;
  156.   }
  157.  }
  158.  
  159.  /* All OK. */
  160.  return(TRUE);
  161. }
  162.  
  163. /* Update link structures */
  164. void DeleteLinkTMObjectMenu(struct TMLink *tml)
  165. {
  166.  struct TMObjectMenu *tmobj=tml->tml_LinkedTo;
  167.  
  168.  /* Clear link */
  169.  if (tml==tmobj->mo_ExecLink)
  170.   tmobj->mo_ExecLink=NULL;
  171.  else if (tml==tmobj->mo_SoundLink)
  172.   tmobj->mo_SoundLink=NULL;
  173. }
  174.  
  175. /* Activate a Menu object */
  176. void ActivateTMObjectMenu(struct TMLink *tml, struct AppMessage *msg)
  177. {
  178.  struct TMObjectMenu *tmobj=tml->tml_Linked;
  179.  
  180.  /* Activate Sound object */
  181.  if (tmobj->mo_SoundLink) CallActivateTMObject(tmobj->mo_SoundLink,NULL);
  182.  
  183.  /* Activate Exec object */
  184.  if (tmobj->mo_ExecLink) CallActivateTMObject(tmobj->mo_ExecLink,msg);
  185. }
  186.