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

  1. /*
  2.  *  FILE: requester.c
  3.  *  Support routines for putting up an Auto Request or creating a Requester.
  4.  *
  5.  *  Public Domain, but keep my name in it as the original author.
  6.  *  31-Aug-88    Jan Sven Trabandt   first release version
  7.  *  31-Oct-88    Jan Sven Trabandt   added more functionality to gimmeRequester
  8.  */
  9.  
  10.  
  11. #define I_AM_REQUESTER
  12. #include <clib/macros.h>
  13. #include "gimmelib/gimmefuncs.h"
  14. #include "gimmelib/requester.h"
  15. #include "gimmelib/macros.h"
  16.  
  17. extern struct GfxBase *GfxBase;
  18.  
  19.  
  20. SHORT gimmeAutoRequest( window, s, textattr )
  21.     struct Window   *window;
  22.     UBYTE        *s;
  23.     struct TextAttr *textattr;
  24. {
  25.     struct IntuiText    itext, ptext, ntext;
  26.     SHORT        xsize, ysize, width;
  27.  
  28.     if( !s ) {
  29.     s = (UBYTE *) GAR_DUMMY_TEXT;
  30.     }
  31.     itext.FrontPen  = AUTOFRONTPEN;
  32.     itext.BackPen   = AUTOBACKPEN;
  33.     itext.DrawMode  = AUTODRAWMODE;
  34.     itext.LeftEdge  = AUTOLEFTEDGE;
  35.     itext.TopEdge   = AUTOTOPEDGE;
  36.     itext.ITextFont = textattr;
  37.     itext.IText     = s;
  38.     itext.NextText  = AUTONEXTTEXT;
  39.  
  40.     ptext = itext;        /* struct copy */
  41.     ntext = itext;        /* struct copy */
  42.     ptext.IText = gimAutReqPostext;
  43.     ntext.IText = gimAutReqNegtext;
  44.     xsize = 0;
  45.     if( textattr ) {
  46.     ysize = textattr->ta_YSize;
  47.     } else if( window ) {
  48.     ysize = window->RPort->TxHeight;
  49.     xsize = window->RPort->TxWidth;
  50.     } else {
  51.     ysize = GfxBase->DefaultFont->tf_YSize;
  52.     }
  53.     if( !xsize ) {
  54.     xsize = GfxBase->DefaultFont->tf_XSize;
  55.     }
  56.     width = MAX(IntuiTextLength(&itext),
  57.         IntuiTextLength(&ptext) + IntuiTextLength(&ntext) + 3*xsize);
  58.     return (
  59.         AutoRequest( window, &itext, &ptext, &ntext, ENDGADGET, ENDGADGET,
  60.             (ULONG) width + xsize * GAR_BORDER_WIDTH,
  61.             (ULONG) ysize * GAR_HEIGHT )
  62.     );
  63. } /* gimmeAutoRequest */
  64.  
  65.  
  66. #define XLEEWAY     8        /* border space */
  67. #define YLEEWAY     4
  68. #define MIN_WIDTH   50        /* minimum dimensions if calculating dimension(s) */
  69. #define MIN_HEIGHT  20        /* not counting y leeways */
  70.  
  71. struct Requester *gimmeRequester( mh, left, top, width, height, backfill,
  72.                     gp, s, textattr, flags )
  73.     void        **mh;
  74.     SHORT        left, top;
  75.     SHORT        width, height;
  76.     UBYTE        backfill;
  77.     struct Gadget   *gp;
  78.     UBYTE        *s;
  79.     struct TextAttr *textattr;
  80.     ULONG        flags;
  81. {
  82.     register struct Requester    *req;
  83.     register struct Border    *bp;
  84.     struct Gadget   *gadg;
  85.     SHORT   len, extra;
  86.     void    *mymh = NULL;
  87.  
  88.     GUESS
  89.     QUIF( !mh );
  90.     req = chainAllocMem( &mymh, (ULONG)sizeof(struct Requester),
  91.                 MEMF_PUBLIC | MEMF_CLEAR );
  92.     QUIF( !req );
  93.     if( flags & POINTREL ) {
  94.         req->RelLeft = left;
  95.         req->RelTop = top;
  96.     }
  97.     req->LeftEdge = left;
  98.     req->TopEdge = top;
  99.     req->ReqGadget = gp;
  100.     req->ReqText = gimmeIntuiText( &mymh, s != NULL ? s : (UBYTE *)"",
  101.                     textattr, 0 );
  102.     QUIF( !req->ReqText );
  103.     req->ReqText->TopEdge = YLEEWAY;
  104.     req->ReqText->LeftEdge = XLEEWAY;
  105.     req->ReqText->BackPen = backfill;
  106.     req->Flags = flags;
  107.     req->BackFill = backfill;
  108.     if( width <= 0 ) {
  109.         width = IntuiTextLength( req->ReqText );
  110.         extra = 0;
  111.         for( gadg = gp; gadg; gadg = gadg->NextGadget ) {
  112.         if( gadg->Flags & GRELRIGHT ) {
  113.             len = -gadg->LeftEdge;
  114.         } else {
  115.             len = gadg->LeftEdge;
  116.         }
  117.         if( !(gadg->Flags & GRELWIDTH) ) {
  118.             len += gadg->Width;
  119.         }
  120.         if( len > width ) {
  121.             width = len;
  122.         } else if( gadg->Activation & (RIGHTBORDER | LEFTBORDER) ) {
  123.             if( len > extra ) {
  124.             extra = gadg->Width;
  125.             }
  126.         }
  127.         } /* for */
  128.         width += extra + XLEEWAY;
  129.         if( width <= 0 ) {
  130.         width = MIN_WIDTH;
  131.         }
  132.     }
  133.     req->Width = width;
  134.     if( height <= 0 ) {
  135.         if( textattr ) {
  136.         height = textattr->ta_YSize;
  137.         } else {
  138.         height = MIN_HEIGHT;
  139.         }
  140.         extra = 0;
  141.         for( gadg = gp; gadg; gadg = gadg->NextGadget ) {
  142.         if( gadg->Flags & GRELBOTTOM ) {
  143.             len = -gadg->TopEdge;
  144.         } else {
  145.             len = gadg->TopEdge;
  146.         }
  147.         if( !(gadg->Flags & GRELHEIGHT) ) {
  148.             len += gadg->Height;
  149.         }
  150.         if( len > height ) {
  151.             height = len;
  152.         } else if( gadg->Activation & (BOTTOMBORDER | TOPBORDER) ) {
  153.             if( len > extra ) {
  154.             extra = gadg->Height;
  155.             }
  156.         }
  157.         } /* for */
  158.         height += extra + YLEEWAY;
  159.     }
  160.     req->Height = height;
  161.     bp = gimmeBorder( &mymh, width - 4, height - 2 );
  162.     if( bp ) {
  163.         bp->LeftEdge = 2;
  164.         bp->TopEdge = 1;
  165.         bp->FrontPen = ~backfill;
  166.         req->ReqBorder = bp;
  167.         /* double thickness vertical lines */
  168.         bp = gimmeBorder( &mymh, width - 6, height - 2 );
  169.         if( bp ) {
  170.         bp->LeftEdge = 3;
  171.         bp->TopEdge = 1;
  172.         bp->FrontPen = ~backfill;
  173.         req->ReqBorder->NextBorder = bp;
  174.         }
  175.     }
  176.     linkChainMem( mh, mymh );
  177.     return( req );
  178.     ENDGUESS
  179.     if( mymh ) {
  180.     chainFreeMem( mymh );
  181.     }
  182.     return( NULL );
  183. } /* gimmeRequester */
  184.