home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 199.lha / GimmeLib / menu.c < prev    next >
C/C++ Source or Header  |  1988-12-27  |  3KB  |  124 lines

  1. /*
  2.  *  FILE: menu.c
  3.  *  Support routines for creating menu and menu item structures.
  4.  *
  5.  *  Public Domain, but keep my name in it as the original author.
  6.  *  31-Oct-88    Jan Sven Trabandt   added to gimme.lib
  7.  */
  8.  
  9.  
  10. #define I_AM_MENU
  11. #include "gimmelib/gimmefuncs.h"
  12. #define GIM_BUILTIN
  13. #include "gimmelib/macros.h"
  14.  
  15. extern struct GfxBase *GfxBase;
  16.  
  17. #define XLEEWAY     10        /* make menu item a little visually appealing */
  18.  
  19.  
  20. struct Menu *gimmeMenu( mhptr, left, width, name, flags )
  21.     void    **mhptr;
  22.     SHORT   left, width;
  23.     UBYTE   *name;
  24.     ULONG   flags;
  25. {
  26.     register struct Menu    *menu;
  27.  
  28.     if( menu = chainAllocMem(mhptr, (ULONG)sizeof(struct Menu),
  29.                     MEMF_PUBLIC | MEMF_CLEAR) ) {
  30.     menu->LeftEdge = left;
  31.     if( width >= 0 ) {
  32.         menu->Width = width;
  33.     } else {
  34.         menu->Width = 9 * strlen( name );
  35.     }
  36.     menu->Height = 9;        /* currently ignored by Intuition */
  37.     menu->Flags = flags;
  38.     menu->MenuName = (BYTE *) name;
  39.     }
  40.     return( menu );
  41. } /* gimmeMenu */
  42.  
  43.  
  44. struct MenuItem *gimmeMenuItem( mhptr, left, width, height, command, name,
  45.                     textattr, flags )
  46.     void        **mhptr;
  47.     SHORT        left;
  48.     SHORT        width, height;
  49.     BYTE        command;
  50.     UBYTE        *name;
  51.     struct TextAttr *textattr;
  52.     ULONG        flags;
  53. {
  54.     register struct MenuItem    *item;
  55.     SHORT            temp;
  56.     void            *mymh = NULL;
  57.  
  58.     GUESS
  59.     QUIF( !mhptr );
  60.     item = chainAllocMem( &mymh, (ULONG)sizeof(struct MenuItem),
  61.                     MEMF_PUBLIC | MEMF_CLEAR );
  62.     QUIF( !item );
  63.     if( flags & ITEMTEXT ) {
  64.         item->ItemFill = (APTR) gimmeIntuiText( &mymh, name, textattr, 0 );
  65.         QUIF( !item->ItemFill );
  66.         ((struct IntuiText *)item->ItemFill)->DrawMode |= INVERSVID;
  67.         if( width < 0 ) {
  68.         width = IntuiTextLength( item->ItemFill ) + XLEEWAY;
  69.         }
  70.         if( height < 0 ) {
  71.         if( textattr ) {
  72.             height = textattr->ta_YSize;
  73.         } else {
  74.             height = GfxBase->DefaultFont->tf_YSize;
  75.         }
  76.         }
  77.     } else {
  78.         item->ItemFill = (APTR) name;
  79.         if( flags & HIGHIMAGE ) {
  80.         item->SelectFill = (APTR) textattr;
  81.         }
  82.         if( width < 0 ) {
  83.         if( (struct Image *) name ) {
  84.             width = ((struct Image *)name)->Width;
  85.         }
  86.         if( (struct Image *) item->SelectFill ) {
  87.             temp = ((struct Image *)item->SelectFill)->Width;
  88.             if( temp > width ) {
  89.             width = temp;
  90.             }
  91.         }
  92.         }
  93.         if( height < 0 ) {
  94.         if( (struct Image *) name ) {
  95.             height = ((struct Image *)name)->Height;
  96.         }
  97.         if( (struct Image *) item->SelectFill ) {
  98.             temp = ((struct Image *)item->SelectFill)->Height;
  99.             if( temp > height ) {
  100.             height = temp;
  101.             }
  102.         }
  103.         }
  104.     }
  105.     if( flags & CHECKIT ) {
  106.         width += CHECKWIDTH;
  107.     }
  108.     if( flags & COMMSEQ ) {
  109.         width += COMMWIDTH + 4;    /* separate text/image from commseq */
  110.     }
  111.     item->LeftEdge = left;
  112.     item->Width = width;
  113.     item->Height = height;
  114.     item->Flags = flags;
  115.     item->Command = command;
  116.     linkChainMem( mhptr, mymh );
  117.     return( item );
  118.     ENDGUESS
  119.     if( mymh ) {
  120.     chainFreeMem( mymh );
  121.     }
  122.     return( NULL );
  123. } /* gimmeMenuItem */
  124.